我想使用OpenGL绘制许多球体(~100k)。到目前为止,我正在做类似
的事情for (int i=0; i<pnum; i++){
glPushMatrix();
glTranslatef(bpos[i].x, bpos[i].y, bpos[i].z);
glCallList(DListSPHERE);
glPopMatrix();
}
在使用适当的球体之前,我使用了GL_POINTS
。这让我可以用一个包含非常高效的所有点的数组来调用glDrawArrays
。有没有比上面的代码更好的方法来绘制许多相同的对象?
答案 0 :(得分:8)
在instancing上查看此页面:它包含许多参考资料:
进行了一些测试,显示何时使用实例化,何时不显示:http://www.ozone3d.net/blogs/lab/?p=87
pseduo-instancing的OpenGL实现(推荐用于旧硬件)。 glsl_pseudo_instancing.pdf
OpenGL实例化: http://www.opengl.org/registry/specs/EXT/draw_instanced.txt
答案 1 :(得分:3)
如果绘制~100k球体,您可能需要考虑光线投射它们而不是使用多边形网格来近似它们。 Sigg等人撰写的论文GPU-Based Ray-Casting of Quadratic Surfaces。 (2006)和Gumhold(2003)的Splatting Illuminated Ellipsoids with Depth Correction展示了如何做到这一点。如果这样做,您可以重复使用大部分快速精灵代码。
答案 2 :(得分:2)
您可以使用点精灵和片段着色器复制渲染球体的效果,而不使用实际球体几何体。不过,我会首先尝试实例化。