Unity Shader采样_CameraDepthTexture深度纹理返回固定灰色问题求助
问题成因与解决方案
- 摄像机未开启深度纹理生成
Unity默认不会自动生成_CameraDepthTexture,需要手动开启:
选中你使用的摄像机,在Inspector面板中将Depth Texture Mode属性设置为Depth;也可以通过挂在摄像机上的脚本开启,代码如下:
void Start() { GetComponent<Camera>().depthTextureMode = DepthTextureMode.Depth; }- 摄像机未开启深度纹理生成
- 未对深度纹理采样结果做线性解码
你当前直接将_CameraDepthTexture的采样结果输出,该纹理存储的是非线性编码的深度值,范围被压缩在很窄的区间内,直接输出大概率会呈现统一的灰色,并非采样返回固定0.5。你需要用Unity内置函数对采样结果解码,修改片元着色器代码如下:
如果解码后整体偏暗/偏亮,可以调整你定义的fixed4 frag (v2f i) : SV_Target { float2 ScreenspaceUV = i.ScreenPos.xy/ i.ScreenPos.w; // 跨平台正确采样深度纹理 fixed rawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, ScreenspaceUV); // Linear01Depth会将深度转为[0,1]区间的线性值,0对应近平面,1对应远平面 float linearDepth = Linear01Depth(rawDepth); fixed4 col = fixed4(linearDepth, linearDepth, linearDepth, 1); return col; }_Scale参数缩放线性深度值,获得更清晰的深度可视化效果。- 未对深度纹理采样结果做线性解码
- 渲染管线适配问题
如果你使用的是URP/HDRP渲染管线而非内置渲染管线,需要额外在管线设置面板中开启深度纹理选项,内置管线不需要这一步。
- 渲染管线适配问题
- 挂载物体的适配问题
你当前的Shader关闭了深度写入和测试,如果挂载到非全屏的普通物体上,采样到的是物体覆盖区域对应的屏幕深度,属于正常表现;如果需要做全屏后处理雾效,建议将该Shader作为后处理材质,通过OnRenderImage接口调用,不要挂载到普通3D物体上。
- 挂载物体的适配问题
内容的提问来源于stack exchange,提问作者Neon Eviscerator
相关产品推荐
相关产品推荐

