第二章 (1)表面着色器和紋理映射

                                (1)  表面着色器和紋理映射


 下面這個 圖 呢 是我們 unity3d  Shader 的 一個 工作流程圖

大體流程:

  • 逐定點修改器    用於模型頂點的修改操作(如果沒有需要的話可以直接下一個步驟);頂點修改器的 輸出參數 是我們的 表面着色器的  輸入參數,( Input )   如果沒有修改就是 原樣輸出
  • 表面(函數)着色器  經過一系列 需要的計算, 將結果輸入到 SurfaceOutput 中 做爲  光照模型的 傳入參數
  • 光照模型  使用表面函數 輸入的信息  以及場景中的  光源信息 結合 (物理計算)  最後到的 像素點的顏色信息

 

    其中  Input   SurfaceOutput  這兩個結構體 分別是

  • Input                  表 面函數輸入 結構體
  • SurfaceOutput   表 面函數輸出 結構體

   

   後面的 章節 也就是圍繞這個五個 部分 進行詳細的講解

 

 

 

漫反射着色原理:

 一個標準的 漫反射shader

Shader "Custom/chapter02/CustomDiffuse"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }         //渲染類型爲不透明
        LOD 200

        CGPROGRAM                              //*****渲染隊 開始 標記  
 
        //第一個 編譯器指令  指定了用到的表面函數 以及 光照模型 還有其他的 渲染設置

        //-surface surf
        //指定當前表面 處理函數爲  surf
        //-Standard  
        //使用的是標準的 光照模型  unity 爲我們提供的 一個標準光照模型資源 ;這裏也可以自定義光照模型
        //-fullforwardshadows    
        //使用的陰影效果
        #pragma surface surf Standard fullforwardshadows    

        //第二個 編譯器指令   指定了 使用的 shader 模型版本爲  3.0
        #pragma target 3.0

        // 表面函數的 輸入結構體 (應爲Unity shader 輸入結構體 不能爲 空,所以即使沒有 貼圖 這裏也不能爲 空)
        struct Input
        {
            float2 uv_MainTex;
        };

        //爲屬性值 關聯的變量
        fixed4 _Color;


        UNITY_INSTANCING_BUFFER_START(Props)
        
        UNITY_INSTANCING_BUFFER_END(Props)

        //表面處理函數  
        //--Input IN
        //表面輸入結構體  
        //
        //--inout SurfaceOutputStandard 
        //標準表面輸出結構體; 填充完畢之後 就會返回到 標準光照模型 standard 裏面進行光照計算 最終會到的像素值
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = _Color;
            o.Albedo = c.rgb;
        }
        ENDCG                                   //*****渲染隊 結束 標記    
    }
    FallBack "Diffuse"
}

 

設置光照模型 爲 蘭伯特光照模型 lambert, 相對於 標準光照模型 SurfaceOutput;  lambert 更簡單 運算更快 修改兩個地方就可以 

#pragma surface surf Lambert fullforwardshadows

void surf (Input IN, inout SurfaceOutput o)
{
     fixed4 c = _Color;
     o.Albedo = c.rgb;
}

//Lambert  光照的模型 需要對應的 表面函數 輸出結構體

 

 

 

壓縮 數組  壓縮矩陣:

Unity Shader  重要 數據類型  壓縮 數組; CG 裏面有兩種數據類型

  •   單值         :     float       int
  •   壓縮數組  :     float3     int4   
  •   壓縮矩陣  :   float4*4(4*4的 float 矩陣)

    壓縮數組 可以拆分:

    float3 ==>  {x, y, z}      ||    {r, g, b}

    float4 ==>  {x, y, z,w}   ||    {r, g, b,a}

壓縮數組的

●  混寫:swizzling

--CG
o.Albdeo = _Color.rgb

--C# 示例 非真實  CG  代碼
o.Albdeo.r =  _Color.r
o.Albdeo.g =  _Color.g
o.Albdeo.b =  _Color.b

  調換 RGB 通道 值

_Color.brg     //就能達到 調換 R 通道 和 B 通道的值

●  塗抹:smearing

 單值 賦給 壓縮數字; 壓縮數組的各個 分量 均被 賦值

o.Albedo = 0 //(0,0,0)

●  遮罩:masking      只對 壓縮數組 指定分量 進行賦值

o.Albedo.rg = _Color.rg

●  壓縮矩陣 

float4*4  matrix;          // 4*4 壓縮矩陣

//... .. .

float first = matrix._m00; // 得到第一行 第一列的 數據
float last  = matrix._m33; // 得到第三行 第三列的 數據



_mrc

float4 diagonal = matrix._m00_m11_m22_m33  //連式獲取 對角線矩陣數據

float4 firstRow = matrix[0]                //獲取矩陣 第一行數據

float4 firstRow1= matrix._m00_m01_m02_m03  //獲取矩陣 第一行數據 (連式方式)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章