2

我正在为 Google Daydream 开发游戏,并且在那里使用的相机确实令人困惑 - 当场景开始时,它们的所有参数都设置为相同的值。最初,我遇到了更多对象网格相互裁剪的问题。我发现解决这个问题的方法是设置nearClippingPlane更高的值。这导致了下一个问题,因为太远了,我的船的驾驶舱没有完全渲染nearClippingPlane。我尝试创建另一个仅渲染驾驶舱的摄像机,但由于我之前提到的原因,它不起作用(摄像机的行为很奇怪),当我通过脚本设置它时,它也无法正常工作。

因此,我需要更改对象的某些属性,而不是相机。我发现了这个,但它只适用于farClippingPlane(否则它将是完美的)。您知道如何nearClippingPlane在不添加第二台相机的情况下忽略一个对象/图层吗?

4

1 回答 1

3

关于进一步的对象网格裁剪,这可能是由于 z-fighting 造成的:https ://en.wikipedia.org/wiki/Z-fighting

请注意,默认情况下,Unity 中的 Daydream 将使用 16 位深度缓冲区。这可以通过播放器设置 -> 其他设置 -> 虚拟现实 SDK -> Daydream 访问。

切换到 32 位深度缓冲区可能nearClippingPlane允许您使用较小的 值渲染驾驶舱中的对象和远处的对象。但是,这主要是一种缓解措施,您可能仍会遇到剪裁问题,尽管问题要小得多。此外,这样做会对性能产生影响,因为您将深度缓冲区使用的内存和带宽增加了一倍。

您应该能够像尝试过的那样使用多个相机。创建一个“Cockpit”和“Environment”相机,使用相机的Depth属性渲染驾驶舱相机。这将首先渲染环境,您可以忽略驾驶舱内的所有对象。这样做的好处是您可以将近平面推得很远。

接下来,将驾驶舱摄像头设置为仅清除深度。您可以将驾驶舱摄像头设置为仅包含您驾驶舱中可能存在的对象。现在渲染器将保留环境,但允许您使用两个不同的深度范围。请注意,这对移动设备也有性能影响,因为多次渲染通道会导致额外的内存传输,并且您还需要在渲染过程中清除深度缓冲区。

您可能需要考虑为您的对象创建单独的层,例如“驾驶舱”和“环境”,以防止事物被渲染两次。

使用两个摄像头的示例场景,注意近/远值的差异

于 2017-03-08T20:22:22.233 回答