編寫自己的Shader(着色器)

一、Shader 程序的基本結構##

Shader程序的基本結構

首先是一些屬性定義,用來指定這段代碼將有哪些輸入。接下來是一個或者多個的子着色器,在實際運行中,哪一個子着色器被使用是由運行的平臺所決定的。子着色器是代碼的主體,每一個子着色器中包含一個或者多個的Pass。在計算着色時,平臺先選擇最優先可以使用的着色器,然後依次運行其中的Pass,然後得到輸出的結果。最後指定一個回滾,用來處理所有Subshader都不能運行的情況(比如目標設備實在太老,所有Subshader中都有其不支持的特性)。
需要提前說明的是,在實際進行表面着色器的開發時,我們將直接在Subshader這個層次上寫代碼,系統將把我們的代碼編譯成若干個合適的Pass。廢話到此爲止,下面讓我們真正實際進入Shader的世界吧。

二、進入Shader內部代碼結構熟悉##

創建Shader
內部展示
屬性定義
屬性的對應
SuberShader(子着色器)
SuberShader

三、簡單Shader展示##

Shader "Custom/ShaderTest" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)

        //在輸入貼圖時候,必須要寫一個什麼都不含的{}
        //需要打開特定選項時可以把其寫在這對花括號內.
        //如果需要同時打開多個選項,可以使用空白分隔
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0



        _MainColor("Main Color",Color)=(0,0,0,1)
        _Testure("Texture",2D)="White"{}
    }
    SubShader {
    //表面着色器可以被若干的標籤(tags)所修飾
    //硬件將通過判定這些標籤來決定什麼時候調用該着色器
        Tags { "RenderType"="Opaque" }//標籤內部就是告訴系統渲染非透明的物體調用我們

        //Tags { "RenderType"="Transparent" }//渲染透明物體調用
        //Tags { "IgnoreProjector"="True" }//不被Projectors影響
        //Tags{ "ForceNoShadowCasting"="True" }//不產生陰影
        //指定渲染隊列(下面有系統預設的隊列)
        //Tags{ "Queue"="Geometry" }
        //Background--最早被調用的渲染,用來渲染天空盒或者背景
        //Geometry--默認值,用來渲染非透明物體(普通情況下,場景中的絕大多數物體應該是非透明的)
        //AlphaTest--用來渲染經過Alpha Test的像素,單獨爲AlphaTest設定一個Queue是出於對效率的考慮
        //Overlay--用來渲染疊加的效果,是渲染的最後階段(比如鏡頭光暈等特效)
        //Transparent--以從後往前的順序渲染透明物體

        //預設的隊列本質就是定義的整數(有點像枚舉值)
        //Background=1000,Geometry=2000,AlphaTest=2450
        //Transparent=3000,最後Overlay=4000

        //如何自定義列表
        //Tags{ "Queue"="Transparent+200" }//通過調用Queue值,確保渲染的先後順序

        //Unity的內建Diffuse着色器的設定值,這個數值決定了我們能用什麼樣的Shader
        //這個數值可以在unity中的質量設定中設定




        LOD 200//着色器的設定值
        
        //Decal, Reflective VertexLit = 150
        //Diffuse = 200
        //Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
        //Bumped, Specular = 300
        //Bumped Specular = 400
       //Parallax = 500
       //Parallax Specular = 600




        //Shader字體:也就是將輸入轉變成輸出的代碼部分
        CGPROGRAM//開始CG語言的編寫
        // Physically based Standard lighting model, and enable shadows on all light types
        //surface:申明的是一個表面着色器
        //surf:着色器代碼的方法的名字,下方的代碼有這個函數
        //Standard:標準
        //fullforwardshadows:光照模型



        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0
        //在CG中,sampler2D就是和texture所綁定的一個數據容器接口
        //其實就是內存存儲的RGB通道,sampler2D:就是GLSL中的2D貼圖的類型
        //其他類型:sampler1D,sampler3D,samplerCube
        // 圖片

        sampler2D _MainTex;
         // 用來獲取MainTex的UV信息

        struct Input {
            float2 uv_MainTex; // 用來獲取MainTex的UV信息

            vec2 coordinate;//float和vec都可以在之後加入一個2到4的數字,來表示被打包在一起的2到4個同類型數
            float4 color;
        };

        half _Glossiness;//half指的是半精度浮點數,精度最低,運算性能相對比高精度浮點數高一些
        half _Metallic;
        // 顏色屬性
        fixed4 _Color;
         // SurfaceOutputStandard 表面着色器輸出一個標準的結構體
        //着色器的工作核心,着色器就是給定了輸入,然後給出輸出進行着色的代碼,第一個參數是Input結果,第二個參數是一個inout的SurfaceOutput結構
        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color

            // 獲取圖片 * 我們選定的顏色
            //fixed4:定點書:整形數據類型,作用就是把所有數進行轉換,得到相應類型的整形表達
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            // 輸出的像素的顏色 = 圖像的顏色(RGB)
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables

            // 輸出的顏色效果(金屬方面) = 設定的金屬值
            o.Metallic = _Metallic;
             // 輸出的光滑粗糙程度 = 設置的光滑粗燥程度
            o.Smoothness = _Glossiness;
            // 輸出的透明通道 = 圖像的透明通道
            o.Alpha = c.a;
        }
        ENDCG//結束CG語言的編寫
    }
    FallBack "Diffuse"
}

結構體展示

四、參考##

https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

https://onevcat.com/2013/08/shader-tutorial-2/

http://www.tuicool.com/articles/JvYJ3em

http://www.itnose.net/detail/6143450.html

CG語言

五、CG語音學習資料##

http://blog.csdn.net/liu_lin_xm?viewmode=contents
https://developer.nvidia.com/cg-toolkit



作者:_譚小坤
鏈接:https://www.jianshu.com/p/745f73f1c324
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章