如何修复关于 UI canvas 的激光渲染

How to fix the rendering of laser with respect to the UI canvas

在 world-space 渲染模式的 canvas 中添加了一些 UI 元素。 UI 元素相对于激光指示器的遮挡存在问题。这里的指针是由线渲染器制成的。以下是已经尝试过的方法,但指针仍未正确遮挡 canvas.

源代码来自 Unity,可用 here。没有需要修改的相关脚本。似乎只需要在此处更改设置或着色器。

可以编写自定义着色器来测试深度,但这将是一个非常昂贵的着色器 - 看起来您想在 VR 上使用它,我不建议这样使用它。

过度设计的解决方案,仍然不是很便宜,但更便宜的解决方案是将 UI 渲染到相机上,相机渲染到 RenderTarget 并将输入传递给 UI。

  1. 创建相机 - 使用 Redner Target 输出
  2. 创建 canvas 使用屏幕 Space - 相机
  3. 将相机连接到 Canvas
  4. 将 Plane 放入世界 space 并将 RenderTarget 用作 material
  5. 添加一个脚本,允许通过 RenderTarget 将 RayCasts 传递到 UI。

几点注意事项:

  • 只要可以保存性能,就需要禁用相机,并且只有在更新 UI 时才通过 Camera.Render() 进行更新。
  • 这个解决方案仍然很昂贵
  • 给一个简单的问题增加了很多复杂性
  • 增加了围绕网格“包裹”UI的可能性

编辑:编辑后问题简单多了!

UI 渲染在 RenderQueue = 3000 你可能有未点亮的 material 作为具有 RenderQueue = 2450.

的线渲染器

您需要为您的线渲染器创建一个 material 和 RenderQueue >= 3000

如果您不想创建新的material,您可以从代码

更改它
// use this with caution! As this can affect other materials when run in editor!
meshRenderer.material.renderQueue = 3100;

编辑 2: 如果您安装了 URP,您可能需要将默认值 material 更改为 URP 中的某些内容。默认 material 使用 Legacy 着色器,这会导致线渲染器和 UI.

出现问题