将纹理映射到图形上,需要指定每个顶点各自对应纹理的哪个部分,即每个顶点关联一个对应的纹理坐标(Texture Coordinate)来标注从纹理图形的哪个部分采样。使用纹理坐标获取纹理颜色叫做采样。
使用纹理颜色代替漫反射颜色来实现纹理贴图。
同时给纹理添加偏移和缩放:
Offset 控制贴图在x,y方向上的偏移
Tiling 控制贴图在x,y方向上的缩放
Shader "Custom/Shader06"{ Properties{ _Color("Color",Color) = (1,1,1,1) //2D---图片 _MainTex("Main Tex",2D) = "white"{} _Specular("Specular Color",Color)=(1,1,1,1) _Gloss("Gloss",Range(10,200))=20 } SubShader{ pass{ Tags{"LightMode"="ForwardBase"} CGPROGRAM #include "Lighting.cginc" #pragma vertex vert #pragma fragment frag sampler2D _MainTex; //_MainTex 的 float4 _MainTex_ST; fixed4 _Color; fixed4 _Specular; half _Gloss; struct a2v{ //给顶点函数传递 float4 vertex:POSITION; float3 normal:NORMAL; //纹理坐标 float4 texcoord:TEXCOORD0; }; struct v2f{ //顶点函数与片元函数之间传递 //返回剪裁空间的顶点坐标 float4 svPos:SV_POSITION; float3 worldNormal:TEXCOORD0; float4 worldVertex:TEXCOORD1; float2 uv:TEXCOORD2; }; v2f vert(a2v v){ v2f f; //坐标模型空间转裁剪空间 f.svPos = UnityObjectToClipPos(v.vertex); f.worldNormal = UnityObjectToWorldNormal(v.normal); f.worldVertex = mul(v.vertex , unity_WorldToObject); //对uv坐标进行更改,先乘缩放倍数,再进行偏移 f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; return f; } fixed4 frag(v2f f):SV_Target{ fixed3 normalDir = normalize(f.worldNormal); //获取顶点的光照方向 fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex)); //获取贴图在uv坐标处的颜色 同时与_Color进行了融合 fixed3 texColor =tex2D (_MainTex , f.uv.xy) *_Color; fixed3 diffuse = _LightColor0.rgb * texColor * max(dot(normalDir,lightDir), 0); fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex)); fixed3 halfDir = normalize(lightDir+viewDir); fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max (dot(normalDir,halfDir),0 ), _Gloss); fixed3 tempColor = diffuse +specular + UNITY_LIGHTMODEL_AMBIENT.rgb; return fixed4(tempColor,1); } ENDCG } } Fallback "Specular" }
效果图:
Unity Shader------实现纹理贴图
猜你喜欢
转载自blog.csdn.net/love_phoebe/article/details/104089696
今日推荐
周排行