3

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

如果我用从 0 向上的 z 值绘制每个四边形并设置 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 会更快。为什么不是?

4

1 回答 1

3

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

于 2013-02-19T04:18:04.513 回答