当点具有相同深度时,opengl深度缓冲缓慢

时间:2013-02-19 03:32:23

标签: performance opengl gpu depth depth-buffer

我正在制作一个2D游戏,涉及在屏幕上绘制大量重叠的四边形。什么并不重要。

如果我用z值从0向上绘制每个四边形并且设置了glDepthFunc(GL_LESS),我会得到一个非常好的速度提升,如你所料。 这是为了避免必须绘制完全隐藏或部分隐藏在其他四边形后面的四边形。 所以我使用类似的东西绘制四边形:

float small = (float(1)/1000000);
for (int iii = 0; iii < 100000; iii++) {
    freeSpace = bullets[iii]->draw(opengl, freeSpace, iii*small);
}

然而,因为我没有将z值用于实际深度,所以我似乎应该可以去:

for (int iii = 0; iii < 100000; iii++) {
    freeSpace = bullets[iii]->draw(opengl, freeSpace, 0.0f);
}

或者只是将z值的0.0f编码到着色器中。 (第三个参数是z值,最后在着色器中设置为gl_position不变。)

奇怪的是,第二种方法(我每次都将z值设置为0.0f)最终得到的结果差不多是前者的一半。

这是为什么?它们都使用glDepthFunc(GL_LESS)和

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 100000*(2*3));

同样如此。我认为如果每次将z设置为0.0f会更快。为什么不呢?

1 个答案:

答案 0 :(得分:3)

我不是肯定的,但我的猜测是原语之间z值的小增量允许zcull硬件工作。这将在片段到达片段着色器之前剔除片段。除了避免片段着色器工作之外,当片段进行深度缓冲测试时,此剔除可以比正常z测试更快的速率发生。