shader學習筆記

1,渲染流水線

1,流水線


流水線.jpg

2,模板測試通常用于限制渲染的區(qū)域,也可用于渲染陰影、輪廓渲染等。
3,關閉混合操作后,通過測試的顏色會直接覆蓋顏色緩沖區(qū)中的值,適用于不透明的物體。
4,批處理思想:將多個小的DrawCall合并成一個大的DrawCall

2,UnityShader基礎

1,UnityShader 結構
基本結構

Shader "Shader名稱"
{
  Properties
  {//屬性
  }
  SubShader
  {//顯卡A使用的子著色器
  }
  SubShader
  {//顯卡B使用的子著色器
  }
  FallBack "VertexLit"
}

進一步

Shader "命名空間\Shader名稱"
{
  Properties
  {
    //屬性
    Name("display name",PropertyType) = DefaultValue
    //eg. _Color("Main Color",Color) = (1,1,1,1)
  }
  SubShader //顯卡A使用的子著色器
  {
    [Tags{"標簽1"="值1" "標簽2"="值2"}] //可選
    //eg. Tags{"Queue"="Transparent" "RenderType" = "Opaque" }
    [RenderSetUp] //可選,狀態(tài)同樣可在Pass塊中聲明,如果在SubShader中聲明,則適用于所有Pass
    //eg. Cull off
    Pass
     {
      [Pass名稱] //可選
      [Tags] //可選
      [RenderSetUp] //可選,同上面RenderSetUp
      
      CGPROGRAM
      //編譯指令,如:
      #pragma vertex funName1  //告訴Unity哪個函數(funName1)包含了頂點著色器的代碼
      #pragma fragment funName2  //告訴Unity哪個函數(funName2)包含了片元著色器的代碼
      
      //Cg代碼
      
      ENDCG
     }
  }
  SubShader
  {//顯卡B使用的子著色器
  }
  FallBack "VertexLit"
}

(1)Property類型


20200907104855415.png

(2)SubShader中的標簽(Tags)


47f06600-e791-4154-bcee-dbf2d5f2f706.jpg

(3)渲染狀態(tài)設置(RenderSetUp)


66de7ac8-994c-47e6-bc7f-1f47e6219add.jpg

(4)Pass中的標簽


20200907155113146.png

2,Pass結構
    Pass
     {
      [Pass名稱] //可選
      [Tags] //可選
      [RenderSetUp] //可選,同上面RenderSetUp
      
      CGPROGRAM
      //編譯指令,如:
      #pragma vertex funName1  //告訴Unity哪個函數(funName1)包含了頂點著色器的代碼
      #pragma fragment funName2  //告訴Unity哪個函數(funName2)包含了片元著色器的代碼
      
      //Cg代碼
      //定義結構體
      struct 結構體名稱                          
      { 
        類型1 名稱1:語義1
        類型2 名稱2:語義2
        ...
      }   
      //eg.
      //struct a2v
      //{
      //  float4 vertex:POSITION
      //  float3 normal:NORMAL
      //  ...
      //}                                              

      // 通過語義POSITION告訴Unity將模型頂點坐標填充到v中,模型頂點數據來自于定義的結構體
      // 通過語義SV_POSITION告訴Unity該函數輸出的是裁剪空間下的頂點坐標
      float4 funName1(float4 v:POSITION):SV_POSITION
      {
        return mul(UNITY_MATRIX_MVP,v);
      }      
      
      fixed4 funName2():SV_Target
      {
        return fixed4(1.0,1.0,1.0,1.0);
      }
      ENDCG
     }

(1)給Pass起名后可在其他Shader中通過UsePass "Pass名稱"命令引用該Pass,但Pass名稱需大寫,如UsePase "MyShader\PASSNAME"
(2)Unity支持的語義:
從應用階段傳遞到頂點著色器:
POSITION、TANGENT、NARMAL、COLOR、TEXCOORDn
從頂點著色器傳遞到片元著色器:
SV_POSITION、COLOR0、COLOR1、TEXTURE0~TEXTURE7
輸出語義:
SV_Target

3,屬性
(1)屬性并不是必須在Properties中聲明才可使用的,在CG代碼中定義后即可使用
(2)在Properties中聲明屬性只是為了將其在材質面板中可視化
(3)在CG中定義屬性時,名稱和類型需與在Properties中聲明的保持一致,如聲明并使用一個名稱為“_Color”的屬性(Properties中類型為Color對應CG中類型為fixed4):

Shader "MyShader"
{
  Properties
  {
     _Color("顏色",Color)=(1,1,1,1)
  }
  SubShader
  {
    Pass
    {
      CGPROGRAM
      fixed4 _Color;
      ......
      ENDCG
    }
  }
}
變量類型
3,標準光照模型

輸出=自發(fā)光+環(huán)境光+高光反射+漫反射
(1)漫反射

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容