Xir*_*dus 5 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 结束,还有什么我应该担心的吗?
首先也是最重要的,您需要知道深度缓冲区的位深度。一般来说,深度缓冲区是定点的,可以是 16 位、24 位或 32 位。
给定定点深度缓冲区和默认深度范围 [ 0 , 1 ],您可以通过使用0.0的正交投影矩阵来使每个整数值表示唯一可区分的深度nearVal:
farVal= 65535.0farVal= 16777215.0 // 最常见的配置farVal= 4294967295.0然后,您可以为分层精灵分配最多farVal+ 1 - 许多不同的深度(始终使用精灵深度的整数值并从0开始),而不必担心深度缓冲区无法区分图层。换句话说,深度缓冲区的精度将决定您可以拥有的最大层数。
| 归档时间: |
|
| 查看次数: |
1534 次 |
| 最近记录: |