【发布时间】:2014-07-27 01:16:09
【问题描述】:
我正在使用 OpenGL 制作 2D 游戏。我想做这样的绘图,首先我将要绘制的所有对象的顶点数据复制到 VBO(每个纹理/着色器一个 VBO),然后在单独的绘图调用中绘制每个 VBO。这似乎是一个好主意,直到我意识到它会打乱绘图顺序 - 绘图调用不一定按照将对象加载到 VBO 中的顺序。我想过使用深度缓冲区对项目进行排序——每个要绘制的新对象的 Z 位置都会稍高一些。问题是,我应该增加多少才不会遇到任何问题? AFAIK,可能有两种问题 - 如果我让它太大,那么我可以在单个帧中绘制的对象数量有限,如果我让它太小,深度缓冲区的精度损失可能会重叠的图像以错误的顺序绘制。总结一下:
1) 我的正交投影的前后值应该是多少? 0比1? -1比1? 1比2?有关系吗?
2) 如果我使用 's nextafter() 来增加 Z 位置,我会遇到什么样的麻烦? OpenGL 和深度缓冲区如何对低于标准的浮点数做出反应?如果我从 std::numeric_limits::min() 开始,到 1 结束,还有什么需要担心的吗?
【问题讨论】:
-
nearVal和farVal的值非常重要。默认情况下,深度范围是 [0,1] 并且深度缓冲区是定点的,所以如果你使用nearVal=0.0和farVal=1.0为例,那么您可以区分的最小深度是 1.0/(256.0*256.0)(16 位)。这是一个非常尴尬的数字并且会受到浮点恶作剧的影响,因此我建议您改为设置farVal以便将深度缓冲区划分为整数。这意味着您希望nearVal和farVal之间的范围等于您的深度缓冲区可以表示的整数值的数量。 -
如果使用混合,则需要手动排序,注意那个
-
@AndonM.Coleman 我觉得这个数字没什么尴尬。
-
@paulm 我没有在精灵之间进行 Alpha 混合。
标签: c++ opengl floating-point depth-buffer