0
点赞
收藏
分享

微信扫一扫

凹凸映射 法线 视差

木樨点点 2022-05-03 阅读 173
unity

法线映射:

        世界/模型空间的法线贴图:直接得到模型空间法线,便于计算,一般只能用于特定模型
        切线空间的法线贴图:可以复用。

//使用切线空间法线纹理,在切线空间计算光照
Shader "may/normal map"
{
    Properties
    {
        _BaseColor  ("基础色RGB", 2D)   = "white"{}
        _normalMap  ("法线贴图", 2D)    = "bump" {}
        _AOmap      ("环境光遮蔽", 2D)  = "white"{}
    }
    SubShader
    {
        Tags { "Queue" = "Geometry" "RenderType"="Opaque"  "IgnoreProjector" = "True" "DisableBatching" = "False" }
        LOD 100

        Pass
        {
            Name "Normal Map"
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"
            sampler2D _normalMap;
            float4 _normalMap_ST;
            sampler2D _BaseColor;
            float4 _BaseColor_ST;
            sampler2D _AOmap;
            float4 _AOmap_ST;

            struct a2v 
            {
                float4 vertex:POSITION;
                float4 uv:TEXCOORD;
                float3 normalMS:NORMAL;
                float4 tangentMS:TANGENT;
            };
            struct v2f 
            {
                float4 pos:SV_POSITION;
                float2 uvBC:TEXCOORD;
                float2 uvNor:TEXCOORD5;
                float2 uvAO:TEXCOORD6;
                fixed3 viewDirTS:TEXCOORD1;
                fixed3 lightDirTS:TEXCOORD2;
                LIGHTING_COORDS(3, 4)
                //SHADOW_COORDS(3)
                //float4 posWS:TEXCOORD6;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                //float4 posWS = mul(unity_ObjectToWorld, v.vertex);
                o.uvBC = TRANSFORM_TEX(v.uv, _BaseColor);
                o.uvNor = TRANSFORM_TEX(v.uv, _normalMap);
                o.uvAO = TRANSFORM_TEX(v.uv, _AOmap);

                float3 viewDirMS = normalize(ObjSpaceViewDir(v.vertex));
                float3 lightDirMS = normalize(ObjSpaceLightDir(v.vertex));
                float3 BinormalMS = cross(v.normalMS, v.tangentMS.xyz) * v.tangentMS.w;
                float3x3 ModelToTangent  =
                {
                    v.tangentMS.xyz,
                    BinormalMS,
                    v.normalMS      
                };
                o.viewDirTS = normalize( mul(ModelToTangent, viewDirMS) );
                o.lightDirTS = normalize( mul(ModelToTangent, lightDirMS) );

                TRANSFER_VERTEX_TO_FRAGMENT(o)
                //TRANSFER_SHADOW(o)

                //o.posWS = mul(unity_ObjectToWorld, v.vertex);
                return o;
            }
            fixed4 frag(v2f i):SV_TARGET0
            {
                fixed3 normalTex = UnpackNormal(tex2D(_normalMap, i.uvBC));
                fixed3 baseColorTex = tex2D(_BaseColor, i.uvNor);
                fixed3 AO = tex2D(_AOmap, i.uvAO);
                //ambient 
                fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * AO;

                //diffuse
                fixed lambert = saturate(dot(normalTex, i.lightDirTS));
                fixed3 diffuseColor = _LightColor0 *baseColorTex * lambert;

                fixed atten = LIGHT_ATTENUATION(i);
                //UNITY_LIGHT_ATTENUATION(atten, i, i.posWS);
                return fixed4( ambientColor + diffuseColor * atten, 1);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

陡峭视差映射  Steep Parallax Mapping

Shader "may/Steep"
{
    Properties
    {
        _BaseColor  ("BaseColor RGB",   2D) =   "white" {}
        _DepthMap   ("DepthMap 0-1",    2D) =   "white" {}
        _AOmap      ("AO",              2D) =   "white" {}
        _LayNum     ("LayNum",          Range(2,100)) = 5
        _BumpScale  ("BumpScale",       Range(0.0,0.1))  = 0.01
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Name "陡峭视差映射"
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            sampler2D _BaseColor;
            float4 _BaseColor_ST;
            sampler2D _DepthMap;
            float4 _DepthMap_ST;
            sampler2D _AOmap;
            float4 _AOmap_ST;
            float _LayNum;
            fixed _BumpScale;

            struct a2v
            {
                float4 vertex:POSITION;
                float4 uv:TEXCOORD;
                float3 normalMS:NORMAL;
                float4 tangentMS:TANGENT;
            };

            struct v2f
            {
                float4 pos:SV_POSITION;
                float2 uvBC:TEXCOORD;
                float2 uvDepth:TEXCOORD1;
                float2 uvAO:TEXCOORD2;
                fixed3 viewDirTS:TEXCOORD3;    //在切线空间空间计算  此时x和y分量 与切线空间的x y分量同向。
                SHADOW_COORDS(4)
                float4 posWS:TEXCOORD5;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.posWS = mul(unity_ObjectToWorld, v.vertex);
                o.uvBC = TRANSFORM_TEX(v.uv, _BaseColor);
                o.uvDepth = TRANSFORM_TEX(v.uv, _DepthMap);
                o.uvAO = TRANSFORM_TEX(v.uv, _AOmap);

                float3 viewDirMS = normalize(ObjSpaceViewDir(v.vertex));
                float3 lightDirMS = normalize(ObjSpaceLightDir(v.vertex));
                float3 BinormalMS = cross(v.normalMS, v.tangentMS.xyz) * v.tangentMS.w;
                float3x3 ModelToTangent  =
                {
                    v.tangentMS.xyz,
                    BinormalMS,
                    v.normalMS      
                };
                o.viewDirTS = normalize( mul(ModelToTangent, viewDirMS) );
                TRANSFER_SHADOW(o)

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {   
                
                //diffuse
                fixed stepDepth = 1.0 / _LayNum;
                fixed depth = 0;
                fixed2 deviatedUV = i.uvDepth;
                while( tex2Dlod(_DepthMap, float4(i.uvDepth, 0, 1)).x > depth)    
                {
                    depth += stepDepth;
                    deviatedUV += i.viewDirTS.xy / i.viewDirTS.z * stepDepth * _BumpScale;
                }


                fixed3 diffuseColor = tex2D(_BaseColor, deviatedUV);
                
                //ambient
                fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * tex2D(_AOmap, deviatedUV);

                UNITY_LIGHT_ATTENUATION(atten, i, i.posWS);
                return fixed4( ambientColor + diffuseColor * atten, 1);
            }
            ENDCG
        }
    }
    FallBack "Specular"
}

举报

相关推荐

0 条评论