Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用深度缓冲区对二维精灵进行分层_C++_Opengl_Floating Point_Depth Buffer - Fatal编程技术网

C++ 使用深度缓冲区对二维精灵进行分层

C++ 使用深度缓冲区对二维精灵进行分层,c++,opengl,floating-point,depth-buffer,C++,Opengl,Floating Point,Depth Buffer,我正在用OpenGL做一个2D游戏。我想这样做,首先我将所有要绘制的对象的顶点数据复制到VBO中(每个纹理/着色器一个VBO),然后在单独的绘制调用中绘制每个VBO。这似乎是个好主意,直到我意识到这会打乱绘图顺序——绘图调用不一定是按照对象加载到VBOs的顺序进行的。我曾想过使用深度缓冲区对项目进行排序——每个要绘制的新对象的Z位置都会稍微高一点。问题是,我应该增加多少以避免出现任何问题?顺便说一句,可能会有两种问题-如果我把它设置得太大,那么我在一个帧中可以绘制的对象数量就会有限;如果我把它设

我正在用OpenGL做一个2D游戏。我想这样做,首先我将所有要绘制的对象的顶点数据复制到VBO中(每个纹理/着色器一个VBO),然后在单独的绘制调用中绘制每个VBO。这似乎是个好主意,直到我意识到这会打乱绘图顺序——绘图调用不一定是按照对象加载到VBOs的顺序进行的。我曾想过使用深度缓冲区对项目进行排序——每个要绘制的新对象的Z位置都会稍微高一点。问题是,我应该增加多少以避免出现任何问题?顺便说一句,可能会有两种问题-如果我把它设置得太大,那么我在一个帧中可以绘制的对象数量就会有限;如果我把它设置得太小,深度缓冲区的精度损失可能会导致重叠图像的绘制顺序错误。总结如下:

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


2) 如果使用的nextafter()增加Z位置,会遇到什么样的问题?OpenGL和深度缓冲区如何对低于正常的浮动作出反应?如果我从std::numeric_limits::min()开始,以1结束,还有什么我应该担心的吗?

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

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

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

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

nearVal和farVal的值非常重要。默认情况下,深度范围为[0,1],深度缓冲区为定点,因此,如果使用
nearVal=0.0
farVal=1.0
,则可以区分的最小深度为1.0/(256.0*256.0)(16位)。这是一个非常尴尬的数字,并且会受到浮点运算的影响,因此我建议您改为设置
farVal
,以便将深度缓冲区划分为整数。这意味着您希望
nearVal
farVal
之间的范围等于深度缓冲区可以表示的整数值。如果使用混合,则需要手动排序,请小心one@AndonM.Coleman我看不出这个数字有什么不对劲。@paulm我没有在精灵之间进行alpha混合。好的,但如何获得深度缓冲区精度(即字节数)?您可以执行以下操作:
GLuint depth\u位;glGetIntegerv(GL_深度_位和深度_位)。至于您实际如何请求某个深度缓冲区精度,这取决于您使用的框架。但这是在OpenGL上下文创建时完成的(除非您使用FBO,但这只会使事情变得比现在更复杂)。如果你没有明确要求一个特定的数量,很多框架默认为24位。“这只是让事情变得比现在需要的更复杂”你是想侮辱我吗?无论如何,非常感谢。@Xirdus:不,一点也不。我的意思是我尽量避免在这里讨论任何额外的腿部工作。设置FBO会不必要地使事情复杂化,但它可以避免与设置默认帧缓冲区深度缓冲区的精度相关的任何特定于平台的过程。你知道,FBO并没有那么难。此外,您查询GL_DEPTH_位的方法似乎已被弃用。但这对我来说不是问题,因为GLFW允许显式地指定它,并记录了默认值24。