Unity Shader 入門精要 筆記(1)

ETH_BOSS發表於2018-12-20

Untiy Shader 結構

標題
//1、定義shader標題,通過/定義shader目錄
Shader "Custom/MyShader"{
    
}
複製程式碼
property

Properties用於定義Shader中需要使用的屬性

以下例子分別定義了Int、Float、2D紋理、Vector、Color的屬性

Shader "Custom/MyShader"{
    Properties {
        _IntValue("IntValue",Int) = 2
        _FloatValue("FloatValue",Float) = 2.0
        _MainTex("MainText",2D) = "black"{}
        _Vector("Vector",Vector) = (1,1,2,3)
        _Color("Color",Color) = (1,1,1,1)
    }
}

複製程式碼

在Properties中定義的屬性最終會在Inspector中出現,開發可以在Inspector中過載其初始值

SubShader

定義一個顯示卡的渲染流程 可配置多個SubShader來定義不同顯示卡的渲染任務

Shader "Custom/MyShader"{
    Properties{
        
    }
    
    SubShader{
        Tags{} // 可選 標籤
        RenderSetup{} //可選 狀態
        Pass{ // 表示一次完整的渲染流程
            
        }
    }
    
}
複製程式碼
RenderSetup

RenderSetup沒有固定的關鍵字和結構體,只需在SubShader裡直接書寫對應指令即可,支援的指令如程式碼所示

Shader ...{
    ...
    ...{
        //剔除指令 可剔除背面、正面渲染或關閉剔除
        Cull Off/Back/Front 
        //深度測試使用的函式
        ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always 
        //深度寫入
        ZWrite On/Off 開啟/關閉 
        //開啟和設定混合模式
        Blend SrcFactor DstFactor
    }
}
複製程式碼

所有的RenderSetup都會作用於每一個Pass,如果需要單獨對某個Pass進行不同的狀態設定,可以單獨在Pass裡定義以上指令

Tags

Tags以鍵值對的形式存在,其定義了 怎樣 和 何時 進行物件渲染

Shader ...{
    ...
    ...{
        Tags {
            "Queue" = "Transparent"           //渲染順序
            "RenderType" = "Opaque"           //著色器分類,用於替換著色器
            "DiableBatching" = "True"         //是否使用批處理
            "ForceNoShadowCasting" = "True"   //是否使用投影
            "IgnorProjector" = "True"         //是否忽略Projector的影響
            "CanUseSpriteAtlas" = "True"      //是否用於精靈模型
            "PreviewType" = "Plane"           //設定在材質皮膚如何預覽該材質
        }
     }
}
複製程式碼
Pass
Shader ...{
    ...
    ...{
        Pass{
            Name "AAAA" //可選
            Tags {
                "LightMode" = "ForwardBase" //定義Pass在流水線中的的角色
                "RequireOptions" = "SoftVegetation" //定義滿足某條件時渲染
            }
            [RenderSetup] //與SubShader裡的RenderSetup一致
            // other code
        }
        
        UsePass "...." //可以使用該方式來複用已經定義的Pass 需要用大寫字母
    }
}
複製程式碼
Fallback
Shader ...{
    ...
    
    Fallback "VertexLit" // 如果顯示卡不支援Pass 用該模式
    
    ...{
        Pass{
            
        }
    }
}
複製程式碼

Shader著色器

著色器是指用於渲染的一小段函式

  • 按照處理的型別分:
    • 頂點著色器:用於負責頂點的幾何計算和頂點的顏色計算。
    • 片元著色器:負責片元的幾何計算和顏色計算。
  • 根據著色器的程式碼型別
    • 表面著色器 Unity中對頂點和片元著色器的高度封裝而成,不需要我們操心諸如光照等複雜場景處理。
    Shader ...{
        SubShader{
            Tags {...}
            
            //表面著色器解除安裝SubShader裡
            CGPROGRAM
            
            //在CGPROGRAM和ENDCG之間的就是表面著色器
            #pragma surface surf Lambert
            struct Input{
                float4 color : COLOR;
            };
            void surf(Input IN,inout SurfaceOutput o){
                o.Albedo = 1;
            }
            
            ENDCG
            
        }
        Fallback ...
    }
    複製程式碼
    • 頂點/片元著色器 基礎的著色器語言,也更復雜,封裝程度不如表面著色器,所以靈活性比表面著色器高。
    Shader ...{
        SubShader{
            
            Tags{ ... }
            //頂點/片元著色器定義在Pass裡
            Pass{
                CGPROGRAM
                //在CGPROGRAM和ENDCG之間的就是頂點/片元著色器
                
                #pragma vertex vert
                #pragma fragment frag
                
                float4 vert(float4 v : POSITION) : SV_POSITION {
                    return mul (UNITY_MATRIX_MVP , v);
                }
                
                fixed4 frag() : SV_Target{
                    return fixed4(1.0,0.0,0.0,1.0);
                }
                
                ENDCG
            }
            
        }
    }
    複製程式碼
    • 固定函式著色器 一種古老的不可程式設計的著色器,只能實現固定簡單的功能 不展開講

相關文章