
第一份是正确的效果,是用shadergraph做的获取水深材质,shadergraph节点如下



第二个是错误的效果,推测是采样贴图的问题,但折腾了两天两夜也没找到哪的问题

以下是代码部分,感谢大家帮助了qwq
Shader "Game/Water"
{
Properties
{
[HideInInspector]
_Gradient("Gradient",2D) = "black"{}
_Depth("Depth",Range(0.001,100)) = 4
_HorizonDistance("HorizonDistance",float) = 10
_HorizonColor("HorizonColor",Color) = (0.5176471,0.4509804,0.5960785,0)
_RefractionScale("RefractionScale",float) = 0.5
_RefractionSpeed("RefractionSpeed",float) = 0.05
_RefractionStrength("RefractionStrength",float) = 0.1
_FoamColor("FoamColor",Color) = (0.6588235,0.9019608,0.8117647,0.8)
_FoamDepth("FoamDepth",float) = 3
_FoamSpeed("FoamSpeed",float) = 0.02
_FoamOffset("FoamOffset",float) = 100
_FoamScale("FoamScale",float) = 0.4
_FoamSeed("FoamSeed",float) = 0
}
SubShader
{
Tags { "RenderType"="Transparent"
"RenderPipeline"="UniversalRenderPipeline" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"UnityCG.cginc"
float _Depth;
float _HorizonDistance;
float4 _HorizonColor;
float _RefractionScale;
float _RefractionSpeed;
float _RefractionStrength;
float4 _FoamColor;
float _FoamDepth;
float _FoamSpeed;
float _FoamOffset;
float _FoamScale;
float _FoamSeed;
sampler2D _Gradient;
float4 _Gradient_TexelSize;
uniform sampler2D _CameraDepthTexture;
struct VertexInput
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct VertexOutput
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float4 ScreenPos : TEXCOORD1;
float4 WorldPos : TEXCOORD2;
};
float GetSceneDepth_Eye(VertexOutput i , float2 uv)
{
float2 screenUV = uv;
return LinearEyeDepth(tex2D(_CameraDepthTexture,screenUV));
}
float4 GetScreenPos_Default(VertexOutput i)
{
return float4(i.ScreenPos.xy / i.ScreenPos.w,0,0);
}
float3 GetViewVectorInv_World(VertexOutput i)
{
return i.WorldPos - _WorldSpaceCameraPos;
}
float4 GetScreenPos_Raw(VertexOutput i)
{
return i.ScreenPos;
}
float2 GetScaleUV(float2 uv)
{
float2 scaleUV;
scaleUV = uv * float2(
length(unity_ObjectToWorld[0].xyz),
length(unity_ObjectToWorld[2].xyz)
);
return scaleUV;
}
float2 GradientNoiseDir(float2 p)
{
p = p % 289;
float x = (34 * p.x + 1) * p.x % 289 + p.y;
x = (34 * x + 1) * x % 289;
x = frac(x / 41) * 2 - 1;
return normalize(float2(x - floor(x + 0.5), abs(x) - 0.5));
}
float GetGradientNoise(float2 UV, float Scale)
{
float2 ip = floor(UV * Scale);
float2 fp = frac(UV * Scale);
float d00 = dot(GradientNoiseDir(ip), fp);
float d01 = dot(GradientNoiseDir(ip + float2(0, 1)), fp - float2(0, 1));
float d10 = dot(GradientNoiseDir(ip + float2(1, 0)), fp - float2(1, 0));
float d11 = dot(GradientNoiseDir(ip + float2(1, 1)), fp - float2(1, 1));
fp = fp * fp * fp * (fp * (fp * 6 - 15) + 10);
return lerp(lerp(d00, d01, fp.y), lerp(d10, d11, fp.y), fp.x) + 0.5;
}
float4 GetRefractionUV(VertexOutput i)
{
float2 uv = GetScaleUV(i.uv);
uv *= _RefractionScale;
uv += _RefractionSpeed * _Time;
float GradientNoise = GetGradientNoise(uv,20);
GradientNoise = GradientNoise * 2 - 1;
GradientNoise *= _RefractionStrength;
return GetScreenPos_Default(i) + GradientNoise;
}
float3 GetDepthWorld(VertexOutput i , float2 uv)
{
float3 DepthWorld = ( i.WorldPos ) - ( _WorldSpaceCameraPos + ( (GetViewVectorInv_World(i) / GetScreenPos_Raw(i).w) * GetSceneDepth_Eye(i,uv) ) );
return DepthWorld;
}
float GetDepth(VertexOutput i , float2 uv)
{
float Depth = saturate(exp( - GetDepthWorld(i,uv).y / _Depth ));
return Depth;
}
float4 GetRefraction(VertexOutput i)
{
float4 RefractionUV = GetRefractionUV(i);
float4 GetScreenPos = GetScreenPos_Default(i);
float BranchPre = sign(GetDepthWorld(i,RefractionUV).y) / 0.5 + 0.5;
return lerp(GetScreenPos,lerp(GetScreenPos,RefractionUV,BranchPre),GetDepth(i,RefractionUV)).y;
}
float4 GetGradientColor(float Time)
{
float4 color = tex2D(_Gradient,float2(Time ,0.25));
return color;
}
VertexOutput vert(VertexInput v)
{
VertexOutput o;
o.WorldPos = mul(unity_ObjectToWorld, v.vertex);
o.vertex = UnityObjectToClipPos(v.vertex);
o.ScreenPos = ComputeScreenPos(o.vertex);
o.uv = v.uv;
return o;
}
float4 frag(VertexOutput i) : SV_Target
{
return GetDepth(i,GetRefraction(i));
}
ENDCG
}
}
}