unity shader 入門
阿新 • • 發佈:2018-07-17
div 技術分享 調用 pos sub 組件 matrix com chap
1.一個簡單的頂點/片元著色器基本結構
Shader "Unity Shaders Book/Chapter 5/Simple Shader" { } SubShader { Pass { CGPROGRAM //告訴unity哪個函數包含了頂點著色器的代碼 #pragma vertex vert //告訴unity哪個函數包含了片元著色器的代碼 #pragma fragment frag //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標float4 vert(float4 v:POSITION) : SV_POSITION{ return mul(UNITY_MATRIX_MVP,V); } //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中 fixed4 frag() : SV_Target { return fixed4(1.0,1.0,1.0,1.0); } ENDCG } } }
2.為頂點著色器定義一個新的傳入參數,使用結構體
Shader "Unity Shaders Book/Chapter 5/Simple Shader" { } SubShader { Pass { CGPROGRAM //告訴unity哪個函數包含了頂點著色器的代碼 #pragma vertex vert //告訴unity哪個函數包含了片元著色器的代碼 #pragma fragment frag //a:應用;v:頂點著色器;a2v:把數據從應用階段傳遞到頂點著色器struct a2v { // POSITION:告訴unity使用模型空間的頂點坐標填充vertex變量 float4 vertex : POSITION; // NORMAL:告訴unity使用模型空間的法線方向填充normal float3 normal : NORMAL; // TEXCOORD:告訴unity使用模型的第一套紋理坐標填充texcoord變量 float texcoord : TEXCOORD; } //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標 float4 vert(a2v v) : SV_POSITION{ return mul(UNITY_MATRIX_MVP,V.tertex); } //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中 fixed4 frag() : SV_Target { return fixed4(1.0,1.0,1.0,1.0); } ENDCG } } }
POSITION,NORMAL,TEXCOORD中的數據由使用該shader的材質的MeshRender組件提供。在每幀調用Draw Call時,Mesh Render組建會把它負責渲染的模型書記發送給shader。
3。為片元著色器定義一個新的傳入參數,使用結構體
Shader "Unity Shaders Book/Chapter 5/Simple Shader" { } SubShader { Pass { CGPROGRAM //告訴unity哪個函數包含了頂點著色器的代碼 #pragma vertex vert //告訴unity哪個函數包含了片元著色器的代碼 #pragma fragment frag struct a2v { // POSITION:告訴unity使用模型空間的頂點坐標填充vertex變量 float4 vertex : POSITION; // NORMAL:告訴unity使用模型空間的發現方向填充normal float3 normal : NORMAL; // TEXCOORD:告訴unity使用模型的第一套紋理坐標填充texcoord變量 float texcoord : TEXCOORD; } struct v2f { // SV_POSITION:告訴unity ,pos裏包含了頂點在裁剪空間中的位置信息 float4 pos : SV_POSITION; // COLOR:存儲顏色信息 fixed3 color : COLOR0; } //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標 v2f vert(a2v v) : SV_POSITION{ //聲明輸出結果 v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); //v.normal包含了頂點的法線方向,其分量範圍在[-1.0,1.0] //下麥呢的代碼把分量範圍映射到了[0.0,1.0] //存儲到o.color中傳遞給片元著色器 o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5); return o; } //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中 fixed4 frag(v2f i) : SV_Target { //將插值後的i.color顯示到屏幕上 return fixed4(i.color,1.0); } ENDCG } } }
v2f用於頂點著色器和片元著色器之間傳遞信息。
4。添加屬性,方便在面板上直接控制模型在屏幕上顯示的顏色
Shader "Unity Shaders Book/Chapter 5/Simple Shader" { Properties{ //聲明一個Color類型的屬性 _Color("Color",Color) = (1.0,1.0,1.0,1.0) } SubShader{ Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag //在CG代碼中,需要定義一個與屬性名稱和類型都匹配的變量 fixed4 _Color; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float texcoord : TEXCOORD; } struct v2f { float4 pos : SV_POSITION; fixed3 color : COLOR0; } v2f vert(a2v v) : SV_POSITION{ v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5); return o; } fixed4 frag(v2f i) : SV_Target { fixed3 c = i.color; //使用_Color屬性來控制輸出顏色 c *= _Color.rgb; return fixed4(c,1.0); } ENDCG } } }
5.添加內置的包含文件
6.126
unity shader 入門