Unity_Shader

关于凹凸映射

2018-08-24  本文已影响28人  _Arturia

直接上代码

切线空间下的凹凸映射

Shader "_MyShader/4_Texture/2_BumpMap/TangentSpace"
{
Properties
{
_Color ("Color",COLOR) = (1,1,1,1)
_MainTex ("MainTex",2D) = "white" {}
_BumpMap ("NormalMap",2D) = "bump" {}
_BumpScale ("BumpScale",float) = 1.0
_SpecularRange ("SpecularRange",Range(10,250)) = 20
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

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

        fixed4 _Color;
        sampler2D _MainTex;
        float4 _MainTex_ST;
        sampler2D _BumpMap;
        float4 _BumpMap_ST;
        float _BumpScale;
        float _SpecularRange;
        

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

        struct v2f{
            float4 pos:SV_POSITION;
            float4 uv:TEXCOORD0;
            float3 tangentLightDir:TEXCOORD1;
            float3 tangentViewDir:TEXCOORD2;
            float3 blinn_Phong_Dir: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.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;
            o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);
            o.uv.zw = TRANSFORM_TEX(v.texcoord,_BumpMap);

            TANGENT_SPACE_ROTATION;
            o.tangentLightDir = normalize(mul(rotation,ObjSpaceLightDir(v.vertex)));
            o.tangentViewDir = normalize(mul(rotation,ObjSpaceViewDir(v.vertex)));

            //Blinn-Phong
            o.blinn_Phong_Dir = normalize(o.tangentLightDir + o.tangentViewDir);

            return o;
        }
        
        fixed4 frag(v2f i):SV_Target{
            //UnpackNormal,UnpackNormalDXT5nm 得到正确的法线方向
            fixed3 tangentNormal = UnpackNormalDXT5nm(tex2D(_BumpMap,i.uv.zw));
            tangentNormal *= _BumpScale;

            fixed3 uvTex = tex2D(_MainTex,i.uv.xy).rgb * _Color.rgb;
            fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * uvTex;

            fixed3 diffuseColor =   _LightColor0 * uvTex * saturate(dot(tangentNormal,i.tangentLightDir));

            fixed3 SpecularColor =  _LightColor0 * pow(saturate(dot(tangentNormal,i.blinn_Phong_Dir)),_SpecularRange);

            fixed4 col = fixed4(diffuseColor + SpecularColor + ambientColor,1);
            
            return col;
        }

        
        ENDCG
    }
}
FallBack "Specular"

}

世界空间下的凹凸映射

Shader "_MyShader/4_Texture/2_BumpMap/WorldSpace"
{
Properties
{
_Color ("Color",COLOR) = (1,1,1,1)
_MainTex ("MainTex",2D) = "white" {}
_BumpMap ("NormalMap",2D) = "bump" {}
_BumpScale ("BumpScale",float) = 1.0
_SpecularRange ("SpecularRange",Range(10,250)) = 20
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

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

        fixed4 _Color;
        sampler2D _MainTex;
        float4 _MainTex_ST;
        sampler2D _BumpMap;
        float4 _BumpMap_ST;
        float _BumpScale;
        float _SpecularRange;
        

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

        struct v2f{
            float4 pos:SV_POSITION;
            float4 uv:TEXCOORD0;
            float3 worldLightDir:TEXCOORD1;
            float3 blinn_Phong_Dir:TEXCOORD2;
            float3 TtoW0:TEXCOORD3;
            float3 TtoW1:TEXCOORD4;
            float3 TtoW2:TEXCOORD5;
        };

        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.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;
            o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);
            o.uv.zw = TRANSFORM_TEX(v.texcoord,_BumpMap);

            o.worldLightDir = normalize(WorldSpaceLightDir(v.vertex));
            float3 worldViewDir = normalize(WorldSpaceViewDir(v.vertex));
            float3 worldNormal = UnityObjectToWorldNormal(v.normal);

            float3 worldTangent = UnityObjectToWorldDir(v.tangent);

            float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w;

            //Blinn-Phong
            o.blinn_Phong_Dir = normalize(o.worldLightDir + worldViewDir);

            o.TtoW0 = float3(worldTangent.x,binormal.x,worldNormal.x);
            o.TtoW1 = float3(worldTangent.y,binormal.y,worldNormal.y);
            o.TtoW2 = float3(worldTangent.z,binormal.z,worldNormal.z);

            return o;
        }
        
        fixed4 frag(v2f i):SV_Target{
            //UnpackNormal,UnpackNormalDXT5nm 得到正确的法线方向

            //fixed3 worldNormal = UnpackNormalDXT5nm(tex2D(_BumpMap,i.uv.zw));
            //worldNormal *= _BumpScale;
            fixed3 bump = UnpackNormal(tex2D(_BumpMap,i.uv.zw));
            bump.xy *= _BumpScale;
            bump.z = sqrt(1 - saturate(dot(bump.xy, bump.xy)));
            
            fixed3 uvTex = tex2D(_MainTex,i.uv.xy).rgb * _Color.rgb;
            fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * uvTex;

            fixed3 diffuseColor =   _LightColor0 * uvTex * saturate(dot(bump,i.worldLightDir));

            fixed3 SpecularColor =  _LightColor0 * pow(saturate(dot(bump,i.blinn_Phong_Dir)),_SpecularRange);

            fixed4 col = fixed4(diffuseColor + SpecularColor + ambientColor,1);
            
            return col;
        }

        
        ENDCG
    }
}
FallBack "Specular"

}

上一篇 下一篇

猜你喜欢

热点阅读