【发布时间】:2013-02-03 15:43:40
【问题描述】:
我正在制作一个 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 会更快。为什么不是?
【问题讨论】:
-
你将深度缓冲区清除到什么值?
-
否,但它小于 1(这是深度缓冲区被清除的值)。所以这个想法是每个像素只被写入一次。我可以使用 GL_LEQUAL,它的性能仍然很差(数量与 GL_LESS 相同)。我的目标是尝试让深度缓冲区只让每个像素被绘制一次,以降低填充率要求。
-
深度缓冲区清除为默认值(我从不更改它)。所以我相信它会清除到 1.0f。
标签: performance opengl gpu depth depth-buffer