1. 程式人生 > >Unity Shader 基本類型和結構

Unity Shader 基本類型和結構

pla prop 文章 ack 遊戲 end 轉換 效果 black

最近看了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的編寫基本可以按照這個結構來填充。

Unity Shader 基本類型和結構