0

这个问题实际上是针对 Unity3D 的,但它也可以是一个更笼统的问题,因此我将尽可能笼统地提出这个问题。

假设我有一个带有 a 的场景,camera (near = 0.3, far = 1000, fov = 60)我想绘制一个半径为 10000 单位的天穹。

物体没有被相机的平截头体剔除,因为我在圆顶内。但是顶点被一些着色器以某种方式剔除,最终结果如下所示:

我剪裁的天穹

现在我的问题是:

我可以更改任何引擎的哪些设置以确保绘制完整的对象并且不会被相机的远平面剪裁?

我不想要的是:

  • 将远平面更改为 10000,因为它会使平截头体不太准确
  • 改近平面,因为我的游戏其实规模很小
  • 改变穹顶的比例,因为这个设置看起来很逼真
4

2 回答 2

1

我不知道如何在 Unity 中执行此操作,但在 DirectX 和 OpenGL 中,您关闭 zbuffer(检查和写入)并首先绘制天空盒。

然后打开 zbuffer 并绘制场景的其余部分。

我的猜测是 Unity 可以为您完成所有这些工作。

于 2011-06-30T19:17:42.343 回答
0

对于我自己的问题,我有两个解决方案。第一个并不能解决所有问题。第二个确实如此,但违反了我自己的设计原则。

我不可能更改着色器的 z-writing,这是来自@Erno 的一个很好的解决方案,因为使用的着色器是第 3 方。

选项1

就在渲染对象之前,将远平面设置为 100,000,并在绘制天空后将其设置回 1000。

问题:深度缓冲区仍然充满了非常低到 100,000 之间的值。这会降低深度缓冲区的准确性,并会导致依赖于深度缓冲区的 z-fighting 和后期效果出现问题。

选项 2

创建两个相互链接的摄像机。摄像机 1 首先使用设置渲染天穹far = 100000, near = 100。相机 2 清除深度缓冲区并使用设置绘制场景的其余部分far = 1000, near = 0.3。深度缓冲区现在不包含大值,从而解决了深度缓冲区不准确的问题。

问题:摄像机必须通过一些轮询系统链接,因为摄像机类没有更改事件(例如,当 FoV 更改时)。我喜欢只有一台相机的事实,但这似乎并不容易。

于 2011-06-30T19:41:21.663 回答