在OpenGL中绘制许多球体
我想使用 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
,这是非常高效的。有没有比上面的代码更好的方法来绘制许多相同的对象?
I want to draw many spheres (~100k) using OpenGL. So far, I'm doing something like
for (int i=0; i<pnum; i++){
glPushMatrix();
glTranslatef(bpos[i].x, bpos[i].y, bpos[i].z);
glCallList(DListSPHERE);
glPopMatrix();
}
Before using proper spheres, I used GL_POINTS
. That allowed me to call glDrawArrays
with an array containing all points which was very efficient. Is there a better way than the above code to draw many, identical objects?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看看 instancing 上的此页面:它包含许多参考资料:
伪实例化的 OpenGL 实现(推荐用于旧硬件)。
glsl_pseudo_instancing.pdf
OpenGL 实例化:
http://www.opengl.org/registry/specs/EXT/draw_instanced。 txt
另请参阅维基百科上的几何实例。
Have a look at this page on instancing: it contains many references:
Some test made that shows when to use instancing and when not: http://www.ozone3d.net/blogs/lab/?p=87
An OpenGL implementation of a pseduo-instancing (recommended for old hardware).
glsl_pseudo_instancing.pdf
OpenGL instancing:
http://www.opengl.org/registry/specs/EXT/draw_instanced.txt
See also Geometry instancing on Wikipedia.
如果您绘制约 100k 球体,您可能需要考虑对它们进行光线投射,而不是使用多边形网格来近似它们。论文基于 GPU 的二次射线投射表面,Sigg 等人。 (2006) 和用Gumhold (2003) 的深度校正展示了如何做到这一点。如果这样做,您可以重用大部分快点精灵代码。
If you draw ~100k spheres, you might want to consider raycasting them instead of using polygon meshes to approximate them. The papers GPU-Based Ray-Casting of Quadratic Surfaces by Sigg et al. (2006) and Splatting Illuminated Ellipsoids with Depth Correction by Gumhold (2003) show how to do this. If you do this, you can reuse much of your fast point sprite code.
您可以使用点精灵和片段着色器来复制渲染球体的效果,而无需实际的球体几何形状。不过,我会先尝试实例化。
You could use point sprites and a fragment shader to duplicate the effect of a rendered sphere without the actual sphere geometry. I would try instancing first, however.