unity3d - 如何修复激光相对于 UI 画布的渲染
问题描述
在世界空间渲染模式下的画布内添加了一些 UI 元素。UI 元素相对于激光笔的遮挡存在问题。这里的指针是由线渲染器制成的。这是已经尝试过的事情,但指针仍然没有正确地遮挡画布。
- 改变层次结构
- 改变 z 顺序
- 更改排序顺序
源代码来自 Unity,可在此处获得。没有需要修改的相关脚本。似乎只需要在这里进行设置或着色器更改。
解决方案
可以编写自定义着色器来测试深度,但这将是一个非常昂贵的着色器——看起来你想在 VR 上使用它,我不建议这样使用它。
过度设计的解决方案仍然不是很便宜但更便宜的解决方案是将 UI 渲染到相机上,该相机将RenderTarget
输入渲染到 UI 并将其传递给 UI。
- 创建相机 - 使用 Redner Target 输出
- 创建使用屏幕空间的画布 - 相机
- 将相机连接到画布
- 将Plane放入世界空间并使用RenderTarget作为材质
- 添加一个脚本,允许通过 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 出现问题。
推荐阅读
- c# - 使用 C# 中的互操作以编程方式在 Excel 中创建动态下拉列表
- regex - 如何使用正则表达式用固定大小的字符替换字符串
- python - 如何使用python在短时间内获得具有两个变量积分表达式的成本函数的最小值?
- arrays - 关于其长度的奇怪数组行为
- data-science - 试图了解 Big Mart 销售预测项目
- ios - 如何正确计算渐变填充动画和旋转中的速度
- google-apps-script - 使用谷歌电子表格向谷歌主页发送文本命令
- selenium - 在子元素 Selenium 列表中搜索文本
- google-cloud-firestore - Firestore,每个字段检索是否计为读取或仅文档本身
- python - 为什么“HELLO”映射到“CITY”而不是“WORLD”?