如何在OpenGL中渲染非常规粒子

3
我有一个粒子系统,其中的位置和各种属性存储在顶点缓冲对象中。这些值由CUDA内核不断更新。目前,我只是使用GL_POINTS渲染它们作为平面圆圈。我想要的是将这些粒子渲染为更复杂的东西,比如3D动画鸟模型。我正在尝试找出最好的方法。假设鸟模型的动画由3帧组成(翅膀的位置等),我们可以循环遍历所有粒子,在翻译、旋转等矩阵操作后调用显示列表。但是这似乎不是一个理想的方法,因为它需要将所有粒子数据从GPU传输到主机,然后再将它们推回GPU(除非我能从CUDA内核中调用绘图函数?)。我对着色器了解不多,它们能处理这样的事情吗?
目前,我主要是寻求建议,但如果您知道任何涉及该主题的文章或教程,那就太好了。
我使用C++在Windows 7 64位上本地使用OpenGL,没有使用GLUT。
2个回答

4
您可能需要使用:EXT_draw_instanced。我从未实际使用过实例化,但大多数现代GPU(我认为是GF6及以上)都允许您向GPU提供模型和点列表,并在每个点上绘制模型。
我会继续搜索更多信息并看看我能找到什么......
好的,这是官方规范,看起来他们有一个教程。 http://www.opengl.org/registry/specs/ARB/draw_instanced.txt

0
你需要发挥创意才能做到这样的事情。如果你使用CUDA计算位置和旋转到2个3组分浮点纹理,然后在每个顶点上发射一个“索引”,并且每个几何实例递增1,那么你可以编写一个着色器来加载纹理,然后使用顶点着色器纹理查找来选择2个纹理中的相关像素,并构建一个变换矩阵。然后,你可以通过所构建的变换矩阵将网格的顶点进行变换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接