如果我使用大数字,OpenGL是否关心?

时间:2011-01-18 15:52:49

标签: opengl

例如,我可以将我绘制实体的位置与屏幕相关联,然后再将它们发送到OpenGL - 或者:我给OpenGL提供相对于游戏世界的直接坐标,当然这些坐标的范围要大得多。

  • 大顶点坐标的绘制速度慢吗?

3 个答案:

答案 0 :(得分:5)

没有速度问题,但您会发现准确性问题,因为您的数字之间的差异与数字的大小相比会非常小。

例如,如果模型以(0,0,0)为中心且为10 x 10 x 10,那么模型两侧的两个点位于(-5,-5,-5)(5,5,5)。如果同一模型以(1000,1000,1000)为中心,则您的积分为(995,995,995)(1005,1005,1005)

虽然绝对差异相同,但相对于坐标的差异不是。

这可能会导致舍入错误并显示伪影。

您应该排列模型的坐标,以便模型的中心位于(0,0,0)。

答案 1 :(得分:5)

较大值的速度与相同数据类型的较小值相同。但是如果你想要超过正常的32位精度并启用类似GL_EXT_vertex_attrib_64bit的东西,那么可能会有性能损失。

允许使用较大的值,但除标准浮点精度问题外,需要注意的另一件事是深度缓冲区的精度。

深度精度是非线性分布的。因此,对于遥远的事物来说,它更精确地靠近并且不那么精确。因此,如果您希望能够为顶点坐标使用各种值,请注意,如果您打算将非常大的物体渲染到相机附近非常小的物体,您可能会看到z-fighting伪像。将近和远剪裁平面设置为尽可能接近实际场景范围将有所帮助,但可能不足以解决问题。有关更多详细信息,请参阅http://www.opengl.org/resources/faq/technical/depthbuffer.htm,尤其是最后两点。

另外,我知道您询问了顶点位置,但纹理坐标可能有超出正常浮点规则的额外精度限制。指定纹理坐标(9999999.5,9999999.5)并期望它正确包装到(0..1,0..1)范围可能无法正常工作(取决于实现/硬件)。

答案 2 :(得分:3)

无论操作数的大小如何,浮点流水线的操作速度都是恒定的。

唯一的危险是获得异常大或小的数字,其中错误失控,最终导致数字不正常。