1.顶点着色器中对深度进行计算
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.depth = (o.pos.z / o.pos.w + 1.0) * 0.5; // Normalize depth to [0, 1]
return o;
}
但是达不到预期,最后返回的值一直大于1。
2.片元着色器中使用深度纹理
sampler2D _CameraDepthTexture;
fixed4 frag(v2f i) : SV_Target
{
float depth = tex2D(_CameraDepthTexture, i.uv).r;
return float4(depth, 0, 0, 1);
}
补充一句:
如果您手动获取深度 (Z) 缓冲区值,您可能需要检查缓冲区方向。下面是一个例子:
float z = tex2D(_CameraDepthTexture, uv);
#if defined(UNITY_REVERSED_Z)
z = 1.0f - z;
#endif
之后才符合距离摄像机越远,深度值越大。