Unity Shader深度水面时的一些坑

时间:2023-02-23   阅读次数:

在编写水面Shader时,会用到深度的读取问题,很多参数是可以随意,但有些是一个字都不能改的,这很坑,能折腾的你要抓狂,比如 sampler2D _CameraDepthTexture; 写到深度表现时明明就这么几行代码,却不完全不一样的结果,Why?

如下面两图的区别,只是少了几个英文字母的区别。找出这个问题,也是在案例中用排除法不断的尝试出来。

shader_water_depth2.png

Shader "ShaderWeb/ToonWaterShijian"
{
    Properties
    {
        _WaterCol("WaterCol",Color)=(0.325, 0.807, 0.971, 0.725)
        _WaterCol2("WaterCol2",Color)=(0.086, 0.407, 1, 0.749)
        _DepthDis("DepthDis",float)=1
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal:NORMAL;
            };
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 scrPos:TEXCOORD0;
            };

            float _DepthDis;
            float4 _WaterCol,_WaterCol2;

            //这个贴图的名称不能随意
            sampler2D _CameraDepthTexture;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.scrPos=ComputeScreenPos(o.pos);
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                float scrDep=tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD(i.scrPos)).r;
                float scrEye=LinearEyeDepth(scrDep);
                float depDif=scrEye-i.scrPos.w;
                return depDif;
            }
            ENDCG
        }
    }
}


参考资料:

《Toon Water Shader》链接:https://roystan.net/articles/toon-water/

其它文章