如何在 OpenGL 中进行粒子合并?

How to do particle binning in OpenGL?

目前我正在创建一个粒子系统,出于获得经验和性能的原因,我想使用 OpenGL 将大部分工作转移到 GPU。目前,有多个粒子散布在 space 中(这些目前仍在 CPU 上创建)。我或多或少想要创建它们的直方图。如果我理解正确,为此我会首先将所有粒子从世界坐标转换为顶点着色器中的屏幕坐标。但是,现在我想执行以下操作:

因此,对于每个像素,都有一个命中计数,表示内部有多少粒子。每个粒子也将有几个属性(例如颜色),我想对每个像素求和(如右下角所示)。这可以使用 OpenGL 吗?如果可以,怎么做?

我推荐的获取全部数据(如果它适合 GPU 内存)的最佳工具是使用 SSBO

尽管如此,您需要 转换它们(例如通过投影)后的数据。 SSBO 仍然是您的最佳选择:

在片段着色器中,您读取已处理粒子的属性(比方说,渲染像素)并将修改后的属性(该像素处的粒子数、颜色等)写入缓冲区中的相同索引。

由于 GPU 的并行特性,来自不同粒子的多个实例可能同时为同一索引执行工作。因此,您需要自己处理。阅读 Memory model and Atomic operations


另一种方法,但有局限性,是使用 Blending

想法是每个片段都会增加帧缓冲区的实际颜色值。这可以通过对 glBlendEquationSeparate 使用 GL_FUNC_ADD 并为每个 RGB/a 组件使用 1/255 (标准化整数)的值作为片段输出颜色来完成。

限制来自[0-255]范围:同一像素最多只能有255个粒子,其余数量clamped到这个范围并且所以 "lost".

您有四个组件 RGBA,因此可以处理四个属性。但是可以在一个 FBO 中有多个 renderbuffers

您可以通过glReadPixels阅读FBO。如果您使用 FBO 而不是默认帧缓冲区,请先使用 glReadBufferGL_COLOR_ATTACHMENTi