2011-12-28 33 views
2

作为OpenGL和图形编程的许多新手,我有一些问题来设置gluPerspective()zNearzFar的值。考虑到我知道我的场景有多大,并考虑到如果将近平面设置得太近,我可能会遇到的深度缓冲区问题。我如何正确设置这些参数?如何为边界球体的给定半径设置gluPerspective()的zNear和zFar值?

简而言之,如果我知道场景的边界球的半径,我怎样才能以正确的方式设置我的投影?

回答

0

也许它很简单:

  1. 查找中心(Z轴)的包围球的
  2. 邻近= centre.z - 半径
  3. 远= centre.z +半径

当然要找到该中心,您将不得不遍历整个可见对象或使用某些场景层次结构。

+0

那么视场角是多少? – danielperaza 2011-12-28 15:46:57

+0

因为我们正在处理球体,那么视场可以设置为90度。或者,您可以使用“atan2”函数来计算非球形边界框的精确值。 – fen 2011-12-29 08:49:20

1

只要将对象与摄像机保持合理的距离,您不必担心会丢失深度缓冲精度。

丢失的比特是比率zFar/zNear的基数2的对数。换句话说,对于牺牲的每个深度缓冲精度位,您可以加倍zFar或减半zNear。对数增长值得感谢。此外,如果您将加倍zNearzFar,则不会牺牲深度缓冲精度的额外位数。

zNear=1zFar=1024仅需要9位深度缓冲精度。这是一个非常舒适的空间。

See this FAQ for details

虽然蓝皮书介绍善于指出的 关系,它有点不准确的。随着比率(zFar/zNear)增加,在深度 缓冲器的背面附近可获得较低的精度,并且在深度 缓冲器的前面附近具有更高的精度。因此,如果原始图像距离观看者更远,则它们更有可能在Z中进行交互。

视场角可以在90-70附近。