纹理映射坐标(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 发表过