Unity - 如何在屏幕覆盖画布上方显示世界空间画布?

Posted

技术标签:

【中文标题】Unity - 如何在屏幕覆盖画布上方显示世界空间画布?【英文标题】:Unity - how to show world space canvas above screen overlay canvas? 【发布时间】:2021-02-12 23:16:57 【问题描述】:

好的,基本上我有一个世界空间画布(目前使用不同的相机)和一个屏幕空间画布。在屏幕空间画布中,我有一个来自飞机上资产商店的模糊材料,它仅适用于屏幕空间。

我需要在仍然有模糊背景和返回按钮的地方进行切换,但在顶部我有我的世界空间画布(下面的“文本”对象):

在第二个摄像头上将 clear flags 设置为 none 可以让我看到第一个摄像头看到的内容,但看不到它的画布。这里是屏幕捕获第一台相机画布的最佳选择吗?

或者有没有办法不让屏幕空间画布挡住世界空间?

【问题讨论】:

您可以在其上添加一个 CanvasGroup 并暂时禁用它。 这里的部分问题是您希望世界空间画布和其他世界空间对象如何表现。例如,如果你有一块石头,然后是一块画布,然后是另一块石头,部分地在彼此后面,那么你想让两块石头都模糊,而不是画布吗?如果是这样,你就有问题了,因为这些世界空间画布与岩石在同一通道中渲染;所以你需要某种后处理着色器来特别不模糊画布......当它们可见时。 【参考方案1】:

所以,如果我理解正确,您有 2 个摄像头,假设:

MainCamera:用于显示 3D 内容 ScreenSpaceCamera: 仅用于显示该屏幕空间“平面”。

而你想要的是:总是在 ScreenSpace 内容之上播放 3D 内容,对吧?


所以你可以做的是创建一个特殊的Layer,例如ScreenSpace 及以上

MainCamera -> Camera:

Depth = 0(值越高表示绘制在顶部) ClearFlags = DepthOnly CullingMask = 一切除了 ScreenSpace

ScreenSpaceCamera -> Camera:

Depth = -1(所以它被绘制在深度级别 0 之后) ClearFlags = 没有(或任何你想要的) CullingMask = 仅限 ScreenSpace


如您现在所见,3D 内容 (RedImage) 始终绘制在 ScreenSpace(白色)之上。


注意:如果您希望能够打开和关闭 Screenspace,您需要一个额外的相机来实际清除图像!正如您在Camera Preview 中看到的那样,相机的缓冲区没有“清除”(因为我们告诉过它)。

因此,如果您禁用Screenspace,您将在预览框中看到您所看到的内容! -> 不好^^

我会简单地添加第三个摄像头,例如BackgroundCamera 作为 MainCamera 的子项(因此它会自动正确移动)并给它

Depth = -2(所以在 ScreenSpace 后面) ClearFlags = 例如SkyBox CullingMask = 什么都没有(所以你真的只在这里渲染背景)

如果您有更复杂的想法,例如

顶部 UI(深度 0) 屏幕空间(深度 -1) 其他 3D 内容 让那些由ScreenSpaceCamera 呈现。因此,如果您停用 Blurr Canvas,它们会正常显示,否则会变得模糊。 背景(深度 -2)

用 4 个相机、深度和不同的层简单地扩展示例。

【讨论】:

谢谢。现在唯一的问题是我的 3d ui 元素背后的 3d 世界仍然是交互式的。有什么方法可以禁用相机 1 所看到的交互? 嗯,这在很大程度上取决于您与事物交互的方式...。如果您禁用相机上的Raycaster 组件,您将无法再与它交互,这就是 UI 的东西。我不确定

以上是关于Unity - 如何在屏幕覆盖画布上方显示世界空间画布?的主要内容,如果未能解决你的问题,请参考以下文章

Unity从深度缓冲重建世界空间位置

unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标

unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标

无法在 Unity WebGL 构建的全屏画布上覆盖 div

统一3d。如何获取ui元素的屏幕或世界位置

如何调整/拉伸世界空间 UI?