2013-02-19 73 views
3

我正在制作一个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,每次都会更快。为什么不是?

+0

什么值你清除深度缓冲区? – 2013-02-19 04:07:38

+0

不,但小于1(这是深度缓冲区被清除的内容)。所以这个想法是每个像素只写入一次。我可以使用GL_LEQUAL,它仍然有可怕的表现(与GL_LESS相同)。我的目标是试图让深度缓冲区只让每个像素被绘制一次,以减少填充率要求。 – Ellipsis 2013-02-19 04:08:14

+0

深度缓冲区清除为默认值(我从不改变它)。所以我相信它会清楚地表明1.0。 – Ellipsis 2013-02-19 04:33:45

回答

3

我并不积极,但我的猜测是基元之间z值的小三角形允许zcull硬件工作。这将在片段到达片段着色器之前挑选出碎片。除了避免片段着色器的工作外,当片段进行深度缓冲区测试时,这种剔除的发生速度可能比正常的z-测试更快。

+0

啊,谢谢。这听起来可能。我在片段着色器中丢弃了,所以我认为早期的zcull是不可能的。然而,正常的扑杀可能会发生。奇怪的是,当点具有和z值时它不会发生?我怎么能解决这个问题?我目前的方法似乎令人费解。我应该使用模板缓冲区,还是让顶点着色器以某种方式生成z值?无论如何,谢谢你的回复。 – Ellipsis 2013-02-19 04:28:34

+0

哦,是的,如果你在片段着色器中杀掉碎片,zcull硬件将无法使用,这也会影响其他z测试性能的提升。如果你可以避免做片段着色器杀死你可能会发现一个显着的性能改善。 – 2013-02-19 04:44:48

+0

我必须画圆圈,因为这似乎是不可避免的。我正在将四边形纹理绘制到四边形和以太网上,所以我必须对其进行混合,这会导致放慢速度,或者在片段着色器中丢弃Alpha值为0的所有像素。还有另一种(更好的)方法吗?即使我在片段着色器中丢弃了,我是否认为某种类型的拼图仍在继续? – Ellipsis 2013-02-19 04:58:42