纹理映射坐标(UV坐标)
定义了该定点在纹理中对应的2D坐标。通常用一个二维变量(u, v)表示,u为横坐标,v为纵坐标,坐标原点在左下角。uv值为0~1
效果

代码
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94  | 
						Shader "WCC/Texture" {     Properties     {         //主颜色         _Color("Main Color", Color) = (1,1,1,1)         //纹理贴图         _MainTex("Main Tex", 2D) = "white"{}         //高光颜色         _Specular("Specular Color", Color) = (1,1,1,1)         //高光区域大小         _Gloss("Gloss", Range(10, 200)) = 20     }     SubShader     {         Pass         {             //指定通道是前向渲染管线中             Tags{"LightingMode" = "ForwardBase"}             CGPROGRAM             //引入平型关相关库                         #include "Lighting.cginc"             #pragma vertex vert             #pragma fragment frag             fixed4 _Color;             sampler2D _MainTex;             //纹理UV名字固定格式 后缀加_ST             float4 _MainTex_ST;             fixed4 _Specular;             half _Gloss;             struct a2v             {                 //获取顶点坐标                 float4 vertex : POSITION;                 //获取法线                 float3 normal : NORMAL;                 //获取纹理UV                 float4 texcoord : TEXCOORD0;             };             struct v2f             {                 float4 position : SV_POSITION;                 //世界空间下顶点坐标                 float4 worldVertex : TEXCOORD0;                 //世界空间下法线                 float3 worldNormal : TEXCOORD1;                 //纹理坐标                 float2 uv : TEXCOORD2;             };             v2f vert(a2v v)             {                 v2f f;                 f.position = UnityObjectToClipPos(v.vertex);                 //顶点坐标由模型空间转世界空间                 f.worldVertex = mul(unity_ObjectToWorld, v.vertex);                 //法线由模型空间转世界空间                 f.worldNormal = UnityObjectToWorldNormal(v.normal);                 //获取纹理UV,添加Tiling、Offset算法                 f.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;                 //同下 Unity内置函数                 // f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);                 return f;             }             fixed4 frag(v2f f) : SV_Target             {                 //法线(单位向量)                 fixed3 normalDir = normalize(f.worldNormal);                 //获取世界空间顶点位置的光照方向(单位向量)                 //因为是平行光,所以对于每个顶点来说,光的位置就是光的方向                 fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);                 // fixed3 lightDir = normalize(UnityWorldSpaceLightDir(f.worldVertex));                 //获取每UV对应的纹理颜色                 fixed3 texColor = tex2D(_MainTex, f.uv) * _Color.rgb;                 //半兰伯特漫反射                 fixed3 diffuse = _LightColor0.rgb * (dot(normalDir, lightDir) * 0.5 + 0.5) * texColor;                 //获取世界空间顶点位置的视角方向(单位向量)                 fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));                 //平行光方向与视野方向的平分线                 fixed3 halfDir = normalize(lightDir + viewDir);                 //计算高光反射(BlinnPhong光照模型)                 //BlinnPhong光照模型:Specular=平行光 * pow( max(cosθ,0),10)  θ是法线和x的夹角  x是平行光和视野方向的平分线                 fixed3 specular = _LightColor0.rgb * pow(max(dot(normalDir, halfDir), 0), _Gloss) * _Specular.rgb;                 //这里将环境光也*texColor 是为了环境光的值和texColor颜色融合,就能让texColor也变得亮                 fixed3 color = diffuse + specular + UNITY_LIGHTMODEL_AMBIENT.rgb * texColor;                 return fixed4(color, 1);             }             ENDCG         }     }     FallBack "Standard" }  | 
					
- 本文固定链接: http://www.u3d8.com/?p=2645
 - 转载请注明: 网虫虫 在 u3d8.com 发表过
 
