c++ - GPU粒子元球表面渲染

标签 c++ opengl graphics glsl particles

我有一个关于如何渲染表面粒子的非常具体的方法的问题。该方法在 Nvidia GPU Gems 3 第 7 章“GPU 上基于点的元球可视化”中有很好的解释,link to this chapter .

这篇文章是关于使用在表面上均匀分布的点或 splats 渲染隐式表面。他们说这些粒子的计算完全在 GPU 上完成。只有定义表面的数据才会从 CPU 发送到 GPU,以尽可能降低流量。

他们还给出了片段着色器程序的一些伪代码示例,用于计算粒子位置、速度等。对我来说,这些程序似乎应该为每个粒子运行一次。

现在我的问题是,它们如何存储这些粒子?它是什么样的数据结构? 它必须是某种缓冲区或纹理,可以访问以在 GPU 上进行读取和写入操作。但是如何在下一个渲染步骤中再次渲染这个缓冲区/纹理?

我的第一个想法是某种顶点缓冲区对象,它在开始时被发送到 GPU 一次,并在每次渲染过程中不断更新。这可能吗?

我的一个要求是它必须使用 OpenGL/GLSL 实现,我希望这是可能的。

最佳答案

是的,您需要某种 VBO 并重复传递相同的数据。数据结构可以是 SoA(数组结构)或 AoS(结构数组),具体取决于您喜欢如何编码访问数组的不同属性,即:

SoA:

  • 位置数组
  • 速度阵列
  • 普通数组

服务质量:

  • 只有一个包含 [Position, Speed, Normal] 的数组。

    AoS 与用于渲染的交错数组相同,其中仅在一个数组中保留网格的所有属性。

您可以使用 VBO 或纹理,唯一的区别是缓存的完成方式,因为纹理针对 2D 访问进行了优化。

渲染的步骤与您想象的完全一样,因此您需要做的就是使用计算所需属性的着色器“渲染”系统的物理步进,然后将相同的结构绑定(bind)到真实的后续步骤中的图形渲染。

关于c++ - GPU粒子元球表面渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803151/

相关文章:

android - 如何在 Android 上的相机预览中粘贴内容?

c++ - glsl 灯似乎不起作用

c++ - 如何正确地将 2D 图像纹理映射到 icosphere

opengl glMaterialfv 与 glMaterialiv

c++ - 托管类中的 native 指针

r - 如何根据绘图/图形/设备区域的坐标从 0 到 1 放置文本?

c - 处理来自 XML 文件构建的 gtkwidget 的事件

c++ - 获取宏参数的最后一个字符

c++ - 我如何将 char 数组转换为 int?

c++ - 如何使用 Teamcenter C++ API 提取标记关系?