【问题标题】:How to render non trivial particles in OpenGL如何在OpenGL中渲染非平凡的粒子
【发布时间】:2011-01-18 10:49:59
【问题描述】:

我有一个粒子系统,其中位置和各种属性存储在顶点缓冲区对象中。这些值由 CUDA 内核不断更新。目前我只是使用 GL_POINTS 将它们渲染为平面圆圈。我感兴趣的是渲染这些粒子更复杂的东西,比如 3d 动画鸟模型。我试图找出最好的方法是什么。为了便于交谈,假设鸟类模型的动画由 3 帧组成(翅膀的位置等等)

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

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

在这一点上,我主要是在寻求有关追求何种途径的建议,但如果您知道任何涉及该主题的文章或教程,请多多支持。


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

【问题讨论】:

    标签: c++ opengl cuda particles


    【解决方案1】:

    您可能想使用:EXT_draw_instanced。我从未真正使用过 Instancing,但大多数现代 GPU(我认为是 GF6 及更高版本)允许您向 GPU 提供模型和点列表,并让它在每个点绘制模型。

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

    嗯,这是官方规范,看起来他们有关于它的教程。

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

    【讨论】:

    • 同意。这正是实例化设计的目的。
    【解决方案2】:

    您需要发挥创造力来做类似的事情。如果您使用 CUDA 计算位置和旋转到 2 3 个分量浮动纹理,然后与每个顶点一起触发一个“索引”,并且每个几何实例递增 1,那么您可以编写一个加载纹理的着色器,然后使用顶点着色器纹理查找以从 2 个纹理中选择相关像素并构建转换矩阵。然后,您可以通过构建的变换矩阵来变换网格的顶点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多