首页 > 解决方案 > 如何修复激光相对于 UI 画布的渲染

问题描述

在世界空间渲染模式下的画布内添加了一些 UI 元素。UI 元素相对于激光笔的遮挡存在问题。这里的指针是由线渲染器制成的。这是已经尝试过的事情,但指针仍然没有正确地遮挡画布。

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

带有 UI 的激光遮挡

标签: unity3doculus

解决方案


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

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

  1. 创建相机 - 使用 Redner Target 输出
  2. 创建使用屏幕空间的画布 - 相机
  3. 将相机连接到画布
  4. 将Plane放入世界空间并使用RenderTarget作为材质
  5. 添加一个脚本,允许通过 RenderTarget 将 RayCast 传递到 UI。可能的解决方案

几点注意事项:

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

编辑:编辑后更简单的问题!

UI 呈现在RenderQueue = 3000您可能有未点亮的材料作为具有RenderQueue = 2450.

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

如果您不想创建新材料,可以从代码中更改它

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

编辑 2:如果您安装了 URP,您可能需要将默认材料更改为 URP 中的内容。默认材质使用 Legacy 着色器,这会导致 Line Renderer 和 UI 出现问题。


推荐阅读