1. 程式人生 > >Unity Shader 紋理映射的實現

Unity Shader 紋理映射的實現

縮放 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 紋理映射的實現