如何在剪切平面附近忽略对象/图层?

时间:2017-02-24 18:49:58

标签: c# android unity3d google-vr daydream

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

Sample scene with two cameras, note the difference in near/far values