我想在opengl中为我的2D游戏绘制大量的2D圆圈。他们都是相同的大小,并具有相同的纹理。许多精灵重叠。什么是最快的方式来做到这一点?性能 - 在opengl中绘制许多2D圆圈
an example of the kind of effect I'm making http://img805.imageshack.us/img805/6379/circles.png
(应当指出的是,黑边只是由于圈子的扩大爆炸,里面装着一会儿这个截屏拍摄后。
目前我我使用了一对带纹理的三角形来制作每一个圆,我在纹理的边缘有透明效果,使它看起来像一个圆圈,使用混合来证明这非常缓慢(并且z culling是不可能的,因为它们是但是我没有使用混合,而是让我的片段着色器丢弃了alpha为0的任何片段。这可以起作用,但这意味着早期的z不是poss ible(作为碎片被丢弃)。
的速度由大量透支和GPU的填充率限制。圆圈的顺序并不重要(假设它在创建闪烁的帧之间不会改变),所以我一直试图确保屏幕上的每个像素只能写入一次。
我试图通过使用深度缓冲区。在每帧开始时,它被清除为1.0f。然后当绘制圆时,它将深度缓冲区的那部分更改为0.0f。如果通常会绘制另一个圆圈,则不是新圆圈的z为0.0f。这不会低于当前深度缓冲区中的0.0f,因此不会被绘制。这是有效的,并且应该减少必须绘制的像素的数量。然而;奇怪的是它并没有更快。我已经提出了一个关于这种行为的问题(opengl depth buffer slow when points have same depth),并且建议在使用相等的z值时,z culling没有被加速。
相反,我必须给所有我的圈子,从0向上分离假z值。然后当我使用glDrawArrays和默认的GL_LESS渲染时,由于z剔除,我们正确地获得了速度提升(尽管早期的z不可能,因为碎片被丢弃以使圆圈可能)。然而,这并不理想,因为我不得不添加大量与z相关的代码来进行2d游戏,而这种游戏根本不需要它(并且如果可能的话,不会传递z值更快)。然而,这是我目前找到的最快捷的方式。
最后,我使用模板缓冲区已经尝试,这里我用
glStencilFunc(GL_EQUAL, 0, 1);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
当模板缓冲区被重置为0的每个帧。这个想法是在第一次绘制像素之后。然后在模板缓冲区中将其更改为非零。那么该像素不应再次被绘制,从而减少透支量。然而,这已经证明不会比仅仅绘制没有模板缓冲区或深度缓冲区的东西快。
什么是最快的方法人们发现写做什么,我想?
你是在一个批次中绘制它们吗? – 2013-02-19 16:38:48
是的,只有一个glDrawArrays(GL_TRIANGLES,0,100001 *(2 * 3));每帧画出它们全部。 – Ellipsis 2013-02-19 16:52:06
嗯我会期待相当好的结果 - 当窗户较小时,它会更快? – 2013-02-19 17:01:23