Unity Shader------实现纹理贴图

将纹理映射到图形上,需要指定每个顶点各自对应纹理的哪个部分,即每个顶点关联一个对应的纹理坐标(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"
}

 效果图:

发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/104089696