【问题标题】:GPU particle metaball-surface renderingGPU 粒子元球表面渲染
【发布时间】:2014-05-22 09:43:00
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 按照今天的标准,那本书是古老的,你知道的。自从那本书写成以来,大约 2-3 代硬件已经引入了用于持久存储转换顶点的新技术。在现代硬件上,首选方法是着色器存储缓冲区和计算着色器。但是在编写时,通常在片段着色器中处理粒子模拟并将像素数据传输到顶点缓冲区或使用顶点纹理提取。转换反馈随后出现。 最终,您的方法将取决于目标硬件要求 - 它们是什么?
  • 是的,使用现代技术渲染粒子可能有更好的方法。我计划尽可能地贴近他们曾经能够应用他们的方法来快速访问相邻粒子数据以及哈希表访问(纹理查询)的管道。也许我必须尝试这些方法是否也可以使用变换反馈方法来渲染粒子。 (硬件要求现在不是那么重要,shader model 4+ 硬件可用:))
  • 在这种情况下,您可以使用像素包缓冲区 (PBO) 将片段着色器的输出完全传输到 GPU 上的缓冲区对象。然后转身将其用作绘图的 VBO。您可能需要多个片段着色器输出,因此需要多个 PBO。
  • 好吧,这听起来很有趣。你有这方面的例子吗?如果我理解正确的话,我会先创建一个 FBO 持有一个 PBO,然后在 PBO 中绘制更改后的粒子的屏幕外绘图。但我仍然想念 PBO 到 VBO 部分 ;-) 找不到任何材料如何做到这一点(到目前为止)。
  • 不是我的头顶。我假设您以前使用过 FBO?尽管它们命名它们实际上并不是“缓冲区对象”(它们是 Framebuffer 对象)。您需要做的是绘制附加到 FBO 的纹理,然后使用 glGetTexImage (...) 将该附件的图像读入您的像素包缓冲区。缓冲区对象只是一般内存,因此只要对齐/图像格式有意义(例如GL_RGBA32F == vec4),Pixel Pack Buffer 就可以立即用作顶点缓冲区对象(只需将其绑定到GL_ARRAY_BUFFER) .

标签: c++ opengl graphics glsl particles


【解决方案1】:

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

SoA:

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

AoS:

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

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

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

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

【讨论】:

  • 感谢您的回答。好的,假设我最初将粒子放入 VBO 并将数据传输到 GPU。在顶点着色器中,我只是将顶点传递给进行处理的片段着色器。结果存储在任何类型的 FBO(渲染目标)中。但是如何将 FBO 数据再次转换为 VBO?在 GPU 上是否有快速/高效的缓冲区传输方式?
  • 您可以使用转换反馈或 glReadPixels 到 PBO 并将 PBO 用作 VBO。 opengl.org/registry/specs/EXT/transform_feedback.txt
  • 这里也有一些示例代码的问题:stackoverflow.com/questions/13568383/error-copying-fbo-to-vbo
  • @bender 如果这是您接受的答案,我将不胜感激,谢谢!
  • 很抱歉,但由于上述方法均未用于最终解决方案,因此我不会接受此答案。也许我写了一个新答案,其中包含针对该特定主题的最佳解决方案。还是谢谢!
猜你喜欢
  • 2012-09-04
  • 2017-01-08
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多