Unity Shader 紋理映射的實現
阿新 • • 發佈:2017-05-23
縮放 bsh cati ret 函數傳遞 mali all main code
1 // 紋理映射的編寫 2 Shader "TMoon/04-Texture" { 3 Properties{ 4 _Color("Color",Color) = (1,1,1,1) 5 _MainTex("Main Tex",2D) = "white"{} 6 } 7 8 SubShader{ 9 10 Pass{ 11 12 Tags {"LightMode" = "ForwardBase"} 13 14 CGPROGRAM 15 16#include "Lighting.cginc" 17 18 #pragma vertex vert 19 #pragma fragment frag 20 21 fixed4 _Color; 22 sampler2D _MainTex; 23 float4 _MainTex_ST; //命名必須根據_MainTex 這裏自動匹配面板的Tiling和Offset 24 25 // application to vertex 26// 由應用程序傳遞給頂點函數 27 struct a2v { 28 float4 vertex:POSITION; 29 float3 normal:NORMAL; 30 float4 texcoord:TEXCOORD0; // 模型的紋理坐標 31 }; 32 33 // vertex to fragment 34 // 由頂點函數傳遞給片元函數 35 struct v2f {36 float4 svPos:SV_POSITION; 37 float3 worldNormal:TEXCOORD0; 38 float4 worldVertex:TEXCOORD1; 39 float2 uv:TEXCOORD2; 40 }; 41 42 v2f vert(a2v v) { 43 v2f f; 44 45 f.svPos = mul(UNITY_MATRIX_MVP, v.vertex); 46 f.worldNormal = normalize(UnityObjectToWorldNormal(v.normal)); 47 // 將模型空間的頂點坐標變換到世界空間上 48 f.worldVertex = mul(v.vertex, unity_WorldToObject); 49 // 將紋理坐標賦值給v2f.uv並賦值面板貼圖的旋轉縮放 50 f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; 51 52 return f; 53 } 54 55 float4 frag(v2f f) : SV_Target{ 56 57 fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex)); 58 59 // tex2D 根據貼圖獲取模型紋理坐標身上對應的像素點顏色值 60 fixed3 texColor = tex2D(_MainTex,f.uv.xy) * _Color.rgb; 61 62 // 為漫反射混合上每個像素點的紋理顏色 63 fixed3 diffuse = _LightColor0.rgb * texColor * max(dot(f.worldNormal, lightDir), 0); 64 65 return fixed4(diffuse,1); 66 } 67 68 ENDCG 69 } 70 } 71 72 Fallback "VertexLit" 73 }
Unity Shader 紋理映射的實現