在编写水面Shader时,会用到深度的读取问题,很多参数是可以随意,但有些是一个字都不能改的,这很坑,能折腾的你要抓狂,比如 sampler2D _CameraDepthTexture; 写到深度表现时明明就这么几行代码,却不完全不一样的结果,Why?
如下面两图的区别,只是少了几个英文字母的区别。找出这个问题,也是在案例中用排除法不断的尝试出来。
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/