7.2基础纹理-法线纹理

//基础纹理
//凹凸映射:使用一张纹理来修改模型表面的法线
//世界空间中的计算
Shader "Unity shader book/Chapter 7/NormalMapWorldSpace" {
    Properties {
        _Color("Color Tint",Color)=(1,1,1,1)
        _MainTex("Main Tex",2D) = "white"{}
        _BumpMap("Normal Map",2D) = "bump"{}//bump内置的法线纹理,当没有提供任何法线纹理时,对应模型自带的法线信息
        _BumpScale("Bump Scale",Float) = 1.0//控制凹凸程度
        _Specular("Specular",Color) = (1,1,1,1)
        _Gloss("Gloss",Range(8.0,256)) = 20
    }
        SubShader{
            Pass{

                Tags{"LightMode" = "ForwardBase"}
                CGPROGRAM

    #pragma vertex vert
    #pragma fragment frag
    #include "Lighting.cginc" //包含文件,为了使用一些变量 如_LightColor0

                fixed4 _Color;
        sampler2D _MainTex;
        float4 _MainTex_ST;
        sampler2D _BumpMap;
        float4 _BumpMap_ST;
        float _BumpScale;
        fixed4 _Specular;
        float _Gloss;

        struct a2v {
        
            float4 vertex:POSITION;
            float3 normal:NORMAL;
            float4 tangent:TANGENT;//tanget.w福切线方向
            float4 texcoord:TEXCOORD0;
        };
        struct v2f {
        
            float4 pos:SV_POSITION;
            float4 uv:TEXCOORD0;
            float4 TtoW0:TEXCOORD1;
            float4 TtoW1:TEXCOORD2;
            float4 TtoW2:TEXCOORD3;
        };

        //修改顶点着色器 计算从切线空间到世界空间的变化
        v2f vert(a2v v) {
        
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
            o.uv.xy = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;
            //o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);
            o.uv.zw = v.texcoord.xy*_BumpMap_ST.xy + _BumpMap_ST.zw;
            //o.uv.zw=TRANSFORM_TEX(v.texcoord,_BumpMap);

            float3 worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
            fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
            fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
            fixed3 worldBinormal = cross(worldNormal, worldTangent)*v.tangent.w;//

            //把他们按列放到从切线空间到世界空间的变换矩阵,然后分别存储在3个变量中。
            o.TtoW0 = float4(worldTangent.x,worldBinormal.x,worldNormal.x,worldPos.x);
            o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
            o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
            
            return o;
        }

        fixed4 frag(v2f i) :SV_Target{
        
            float3 worldPos = float3(i.TtoW0.w,i.TtoW1.w,i.TtoW2.w);
            fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos));
            fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));

            fixed3 bump = UnpackNormal(tex2D(_BumpMap,i.uv.zw));
            bump.xy *= _BumpScale;
            bump.z = sqrt(1.0-saturate(dot(bump.xy,bump.xy)));

            bump = normalize(half3(dot(i.TtoW0.xyz,bump),dot(i.TtoW1.xyz,bump),dot(i.TtoW2.xy,bump)));


            fixed3 albedo = tex2D(_MainTex,i.uv).rgb * _Color.rgb;
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

            fixed3 diffuse = _LightColor0.rgb * albedo * max(0,dot(bump, lightDir));

            fixed3 halfDir = normalize(lightDir+ viewDir);
            fixed3 specular = _LightColor0.rgb *_Specular.rgb*pow(max(0,dot(bump,halfDir)), _Gloss);

            return fixed4(ambient + diffuse + specular, 1.0);
        }

            ENDCG
        }
    }
    FallBack "Specular"
}
 


版权声明:本文为qq_22660469原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。