使用深度缓冲区分层2D精灵

时间:2014-06-05 21:28:27

标签: c++ opengl floating-point depth-buffer

我正在使用OpenGL制作2D游戏。我想做绘图,首先我将要绘制的所有对象的顶点数据复制到VBO(每个纹理/着色器一个VBO),然后在单独的绘制调用中绘制每个VBO。这似乎是一个好主意,直​​到我意识到它会弄乱绘图顺序 - 绘制调用赢得了必然是为了将对象加载到VBO中。我想过使用深度缓冲来对项目进行排序 - 每个要绘制的新对象都会有更高的Z位置。问题是,我应该增加多少以避免遇到任何问题? AFAIK,可能有两种问题 - 如果我把它做得太大,那么我可以在一个帧中绘制有限数量的对象,如果我把它做得太小,深度缓冲区的精度损失可能会使重叠的图像绘制顺序错误。总结一下:

1)我的正投影的前后值应该是多少? 0到1? -1比1? 1到2?这有关系吗?

2)如果我使用nextafter()来增加Z位置,我会遇到什么样的麻烦? OpenGL和深度缓冲区如何对次正常浮点数做出反应?如果我从std :: numeric_limits :: min()开始,并以1结束,还有什么我应该担心的吗?

1 个答案:

答案 0 :(得分:4)

首先,您需要知道深度缓冲区的位深度。通常,深度缓冲区是定点的,16位,24位或32位。

给定定点深度缓冲区和默认深度范围[ 0 1 ],您可以通过使用正交投影使每个整数值表示唯一可区分的深度nearVal 0.0 矩阵和

  • 16位:farVal = 65535.0
  • 24位:farVal = 16777215.0 //最常见的配置
  • 32位:farVal = 4294967295.0

然后,您可以将分层精灵分配到farVal + 1 - 多种不同的深度(对于精灵深度始终使用整数值,并以 0 )并且不用担心深度缓冲区无法区分层。换句话说,深度缓冲区的精度将决定您可以拥有的最大层数。