我正在制作一个2D游戏,涉及在屏幕上绘制大量重叠四边形。什么并不重要。当点有相同的深度时,opengl深度缓冲区变慢
如果我绘制每个四元组的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);
}
或者只是将0.0f的z值编码到着色器中。 (第三个参数是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,每次都会更快。为什么不是?
什么值你清除深度缓冲区? – 2013-02-19 04:07:38
不,但小于1(这是深度缓冲区被清除的内容)。所以这个想法是每个像素只写入一次。我可以使用GL_LEQUAL,它仍然有可怕的表现(与GL_LESS相同)。我的目标是试图让深度缓冲区只让每个像素被绘制一次,以减少填充率要求。 – Ellipsis 2013-02-19 04:08:14
深度缓冲区清除为默认值(我从不改变它)。所以我相信它会清楚地表明1.0。 – Ellipsis 2013-02-19 04:33:45