0
点赞
收藏
分享

微信扫一扫

Unity纹理基础

        单张纹理材质实现:

Shader "Custom/SimpleTextureMat"
{
    Properties{
        //TintColor:色调
        _Color("TintColor", Color) = (1.0, 1.0, 1.0, 1.0)  
        _MianTex("Maintex", 2D) = "white"{}
        _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0)
        _Gloss("Gloss", Range(8.0, 256)) = 20
    }
    SubShader{
        Pass{
            Tags{
                "LightMode" = "ForwardBase"
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            half4 _Color;
            sampler2D _MianTex;
            float4 _MianTex_ST;
            half4 _Specular;
            half _Gloss;

            struct a2v{
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f{
                float4 vertex : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD3;
            };

            v2f vert(a2v i){
                v2f o;
                UNITY_INITIALIZE_OUTPUT(v2f, o);
                o.vertex = UnityObjectToClipPos(i.vertex);

                o.worldNormal = normalize(UnityObjectToWorldNormal(i.normal));
                o.worldPos = mul(unity_ObjectToWorld, i.vertex);

                o.uv = TRANSFORM_TEX(i.texcoord, _MianTex);
                //o.uv = i.texcoord;

                return o;
            }

            half4 frag(v2f i) : SV_TARGET{

                half3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos)); 
                half3 albedo = tex2D(_MianTex, i.uv) * _Color;
                half3 diffuse = _LightColor0.rgb * albedo * saturate(dot(i.worldNormal, lightDir));

                half3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;

                half3 reflectDir = normalize(reflect(-lightDir, i.worldNormal));

                half3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));

                half3 specular = _LightColor0.rgb * albedo * pow(saturate(dot(reflectDir, viewDir)), _Gloss);

                return half4(diffuse + ambient + specular, 1.0);
            }
            ENDCG
        }
    }

    FallBack "Specular"
}

         部分代码段分析:

                o.uv = TRANSFORM_TEX(i.texcoord, _MianTex);

 TRANSFROM_TEX原理为:

ambient(环境光)diffuse(固有色)specular(高光)都可以选择性乘以纹素(Texel) 以达到不同的效果。

        ambient,diffuse:

         ambient,diffuse,specular: 

         diffuse,specular:

举报

相关推荐

0 条评论