GPU粒子元球表面渲染

时间:2014-05-22 09:43:01

标签: c++ opengl graphics glsl particles

我对如何渲染表面粒子的非常具体的方法有疑问。这个方法在Nvidia GPU Gems 3第7章“基于点的GPU上的元代码可视化”中得到了很好的解释,link to this chapter

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

他们还提供了片段着色器程序的一些伪代码示例来计算粒子位置,速度等。对我来说,看起来这些程序应该为每个粒子运行一次。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

SoA的:

  • Positions Array
  • Speed Array
  • 普通数组

AOS:

  • 只有一个包含[位置,速度,正常]的数组。

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

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

渲染分步完成,就像你想象的那样,所以你需要做的就是#34;渲染"系统的物理步进使用着色器计算所需的属性,然后将相同的结构绑定到后续步骤中的真实图形渲染。