如何在OpenGL中渲染非平凡的粒子

时间:2010-02-18 17:49:28

标签: c++ opengl cuda particles

我有一个粒子系统,其中位置和各种属性存储在顶点缓冲区对象中。这些值由CUDA内核不断更新。目前我只是使用GL_POINTS作为扁平圆圈来渲染它们。我感兴趣的是渲染这些粒子更像是3D动画鸟模型。我想弄清楚最好的方法是什么。为了交谈,我们可以说鸟模型的动画由3帧组成(翅膀的位置,不是什么)

我可以看到将模型加载到显示列表中并在翻译,旋转等矩阵中循环所有粒子,然后调用显示列表。这似乎不是一种理想的方法,因为它需要将所有粒子数据从gpu带到主机,只是为了将矩阵运算推回GPU(除非我可以从cuda内核调用绘图函数? ?)

我对着色器了解不多,他们能够处理这样的事情吗?

在这一点上,我主要是寻求有关追求什么途径的建议,但如果你知道任何涉及该主题的文章或教程,那就是赞誉。


我正在使用C ++在Windows 7 64位上本地使用OpenGL。我没有使用GLUT

2 个答案:

答案 0 :(得分:4)

您可能想要使用:EXT_draw_instanced。我从来没有真正使用过Instancing,但是大多数现代的GPUS(GF6和我认为)允许你为GPU提供一个模型和一个点列表,并让它在每个点上绘制模型。

我会谷歌更多信息,看看我想出了什么......

这是官方规范,看起来他们有一个教程。

http://www.opengl.org/registry/specs/ARB/draw_instanced.txt

答案 1 :(得分:0)

你需要有创意去做那样的事情。如果您使用CUDA计算位置和旋转到2 3组件浮动纹理,然后随每个顶点发出“索引”并按每个几何实例递增1,那么您可以编写加载纹理的着色器然后使用顶点着色器纹理查找以从2个纹理中选择相关像素并构建变换矩阵。然后,您可以通过已构建的变换矩阵变换网格的顶点。