我正在使用OpenGL制作2D游戏。我想做绘图,首先我将要绘制的所有对象的顶点数据复制到VBO(每个纹理/着色器一个VBO),然后在单独的绘制调用中绘制每个VBO。这似乎是一个好主意,直到我意识到它会弄乱绘图顺序 - 绘制调用赢得了必然是为了将对象加载到VBO中。我想过使用深度缓冲来对项目进行排序 - 每个要绘制的新对象都会有更高的Z位置。问题是,我应该增加多少以避免遇到任何问题? AFAIK,可能有两种问题 - 如果我把它做得太大,那么我可以在一个帧中绘制有限数量的对象,如果我把它做得太小,深度缓冲区的精度损失可能会使重叠的图像绘制顺序错误。总结一下:
1)我的正投影的前后值应该是多少? 0到1? -1比1? 1到2?这有关系吗?
2)如果我使用nextafter()来增加Z位置,我会遇到什么样的麻烦? OpenGL和深度缓冲区如何对次正常浮点数做出反应?如果我从std :: numeric_limits :: min()开始,并以1结束,还有什么我应该担心的吗?
答案 0 :(得分:4)
首先,您需要知道深度缓冲区的位深度。通常,深度缓冲区是定点的,16位,24位或32位。
给定定点深度缓冲区和默认深度范围[ 0 , 1 ],您可以通过使用正交投影使每个整数值表示唯一可区分的深度nearVal
的 0.0 矩阵和
farVal
= 65535.0 farVal
= 16777215.0 //最常见的配置 farVal
= 4294967295.0 然后,您可以将分层精灵分配到farVal
+ 1 - 多种不同的深度(对于精灵深度始终使用整数值,并以 0 )并且不用担心深度缓冲区无法区分层。换句话说,深度缓冲区的精度将决定您可以拥有的最大层数。