Unity VR中Raymarching Compute Shader _DepthTexture未设置错误求助
解决Unity VR中SPH流体Raymarching Compute Shader的_DepthTexture未设置错误
错误核心原因
报错明确指出:Compute Shader的_DepthTexture属性在kernel 0中未被赋值,导致OnRenderImage方法执行失败,进而中断VR场景的渲染流程,出现启动卡Logo、Game窗口黑屏的问题。
分步修复方案
1. 开启相机深度纹理支持
在FluidRayMarching.cs的Start或Awake方法中,添加代码开启主相机的深度纹理输出,确保能获取到场景深度数据:
void Start() { // 开启相机深度纹理模式 Camera.main.depthTextureMode |= DepthTextureMode.Depth; }
2. 在OnRenderImage中正确传递_DepthTexture
找到FluidRayMarching.cs中第90行附近的OnRenderImage方法,在调度Compute Shader之前,添加代码将深度纹理传递给Compute Shader:
void OnRenderImage(RenderTexture source, RenderTexture destination) { // 获取Compute Shader的kernel索引 int kernelIndex = computeShader.FindKernel("CSMain"); // 关键:传递深度纹理给Compute Shader computeShader.SetTexture(kernelIndex, "_DepthTexture", source); // 此处添加其他参数的设置(如流体粒子数据、相机矩阵等) // 调度Compute Shader(根据你的分辨率调整线程组数量) int threadGroupsX = Mathf.CeilToInt(Screen.width / 8f); int threadGroupsY = Mathf.CeilToInt(Screen.height / 8f); computeShader.Dispatch(kernelIndex, threadGroupsX, threadGroupsY, 1); // 将处理后的结果渲染到目标纹理 Graphics.Blit(source, destination); }
注意:确保
computeShader变量已在Inspector面板中正确绑定你的Raymarching.compute文件。
3. 验证Compute Shader中的纹理声明
打开Raymarching.compute,确认_DepthTexture的声明正确,且与脚本中传递的名称完全一致:
// 在Compute Shader的Properties区域添加 Texture2D<float> _DepthTexture; SamplerState sampler_DepthTexture; // 在CSMain kernel中使用示例 [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) { float depth = _DepthTexture.Sample(sampler_DepthTexture, float2(id.x / _ScreenWidth, id.y / _ScreenHeight)).r; // 后续光线步进逻辑 }
额外排查点
- 检查Compute Shader的kernel名称是否与脚本中
FindKernel的参数一致(比如脚本里用CSMain,Compute Shader里的kernel也要叫这个) - 确认VR场景的相机设置正确:已启用VR支持,相机的Clear Flags未设置为错误值(如
Nothing) - 若仍有问题,可暂时关闭VR模式测试Compute Shader是否正常运行,排除VR环境的额外干扰
内容的提问来源于stack exchange,提问作者pa87901
相关产品推荐
相关产品推荐

