Unity Shader 基本類型和結構


最近看了siki老師的shader教程,感謝siki老師,講課真好。之前看了一些Shader的書,因為沒有圖形學的基礎,所以看的挺痛苦的。然后看了siki老師的視頻后,結合以前看的書一下子明了了。

在這里我寫下筆記和視頻的代碼,方便自己以后查看。

在這篇文章里主要介紹了Unity Shader的基本類型和內置的兩個方法。代碼里有很多注釋了,如果想更深入地學習的話建議去看siki老師的視頻,講得非常明白。在這里就不啰唆了。

//這里指定shader的名字,不要求跟文件名保持一致
Shader "TMoon/01-Basic Shader" {
    // 屬性  類似C#的屬性,可以在面板復制修改
    Properties{
        // 屬性名字("面板顯示的名字",屬性的類型) = (屬性的默認值)
        // 這里基本例舉了Shader所有的屬性(類型)
        _Color("Color",Color) = (1,1,1,1) // float類型
        _Vector("Vector",Vector) = (1,2,3,4) // float類型
        _Int("Int",Int) = 1234 // float類型
        _Float("Float",Float) = 1.2 // float類型
        _Range("Range",Range(1,11)) = 6 // float類型
        _2D("Texture",2D) = "red" {} // sampler2D類型
        _3D("Texture",3D) = "black"{} // sampler3D類型
        _Cube("Cube",Cube) = "white"{} // samplerCUBE類型  例子:天空盒子,6個面
    }

    //SubShader可以寫很多個 顯卡運行效果的時候,從第一個SubShader開始
    //如果第一個SubShader里面的效果都可以實現,那么就使用第一個SubShader,
    //如果顯卡這個SubShader里面某些效果它實現不了,它會自動去運行下一個SubShader
    SubShader{
        //類似Unity的MonoBehaviour,Shader所有的代碼放在Pass里執行
        //所以至少有一個Pass
        Pass{
            //在這里編寫Shader代碼
            CGPROGRAM

            // Properties的值需要在這里再聲明一次才可以Shader里使用
            // 這里有個細節,類似C#的int float double類型,他們精度不一樣
            // Shader里也有關於數字的精度不一樣的類型,分別是float half fixed
            // float 32位 half 16位  fixed 11位(-2到+2)
            // 所以關於顏色可以用fixed來存儲
            fixed4 _Color;
            float4 _Vector;
            float _Int;
            float _Float;
            half _Range;
            sampler2D _2D;
            sampler3D _3D;
            samplerCUBE _Cube;

            // 類似MonoBehaviour的Start Update這些內置方法
            // 只不過Shader可以讓我們自定義這些方法參數,返回值,方法名。
            // vertex聲明頂點函數 vert為函數名
            // 頂點函數的基本作用:完成頂點坐標從模型空間到剪裁空間的轉換(從游戲環境轉換到視野相機屏幕上)
            // 調用時機:模型上擁有多少頂點就調用多少次
            #pragma vertex vert

            // fragment聲明片元函數 frag為函數名
            // 片元函數基本作用:返回模型對應的屏幕上的每一個像素的顏色值(顯示模型)
            // 調用時機:模型上擁有多少像素就調用多少次,所以調用次數和細節大於頂點函數
            #pragma fragment frag

            //一般參數傳值方式(比較直接)  后面介紹利用結構體去傳值

            //通過語義告訴系統,我這個參數是干嘛的
            //比如POSITION是告訴系統我需要自動傳入模型的頂點坐標
            //SV_POSITION這個語義用來解釋說明返回值, 意思是返回值是剪裁空間下的頂點坐標
            float4 vert(float4 v : POSITION) : SV_POSITION{
                //通過矩陣變換將模型頂點坐標變換到裁剪空間(線性代數的知識,或者記住矩陣的作用一般用於變換坐標)
                return mul(UNITY_MATRIX_MVP,v);
            }

            float4 frag() : SV_Target{
                // 返回模型每個像素的顏色值
                return fixed4(0.5,0.5,1,1);
            }

            ENDCG
        }
    }

    // 如果所有的SubShader都失敗則使用VertexLit 這里是系統默認的
    Fallback "VertexLit"
}
01-Basic Shader

 Shader的編寫基本可以按照這個結構來填充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM