Unity Shader 入門精要 筆記(1)

Untiy Shader 結構

標題
//一、定義shader標題,經過/定義shader目錄
Shader "Custom/MyShader"{
    
}
複製代碼
property

Properties用於定義Shader中須要使用的屬性編程

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

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裏直接書寫對應指令便可,支持的指令如代碼所示ui

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

全部的RenderSetup都會做用於每個Pass,若是須要單獨對某個Pass進行不一樣的狀態設置,能夠單獨在Pass裏定義以上指令spa

Tags

Tags以鍵值對的形式存在,其定義了 怎樣 和 什麼時候 進行對象渲染code

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
            }
            
        }
    }
    複製代碼
    • 固定函數着色器 一種古老的不可編程的着色器,只能實現固定簡單的功能 不展開講
相關文章
相關標籤/搜索