如何在OpenGL中进行粒子装箱?

如何在OpenGL中进行粒子装箱?,opengl,histogram,particles,binning,Opengl,Histogram,Particles,Binning,目前我正在创建一个粒子系统,为了获得经验和性能原因,我想使用OpenGL将大部分工作转移到GPU。目前,有多个粒子散布在空间中(这些粒子目前仍在CPU上创建)。我多多少少想为它们创建一个柱状图。如果我理解正确,我会首先在顶点着色器中将所有粒子从世界坐标转换为屏幕坐标。但是,现在我想做以下工作: 因此,对于每个像素,都有一个内部粒子数的命中计数。每个粒子也将有几个属性(例如颜色),我想为每个像素求和(如右下角所示)。使用OpenGL是否可能做到这一点?如果是这样,怎么做?我推荐的拥有整个数据(如

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


因此,对于每个像素,都有一个内部粒子数的命中计数。每个粒子也将有几个属性(例如颜色),我想为每个像素求和(如右下角所示)。使用OpenGL是否可能做到这一点?如果是这样,怎么做?

我推荐的拥有整个数据(如果它适合GPU内存)的最佳工具是使用

然而,在转换数据之后,您需要数据(例如,通过投影)。但SSBO仍是您的最佳选择: 在片段着色器中,可以读取已处理粒子的属性(例如,渲染像素)并将修改的属性(该像素处的粒子数、颜色等)写入缓冲区中的相同索引

由于GPU的并行性,来自不同粒子的多个实例可能同时执行相同索引的工作。因此,你需要自己处理这个问题。阅读和


另一种方法是使用 其思想是每个片段增加帧缓冲区的实际颜色值。这可以使用
glBlendEquationSeparate
GL\u FUNC\u ADD
完成,并使用每个RGB/a组件的
1/255
(标准化整数)值作为片段输出颜色

限制来自[0-255]范围:同一像素中最多只有255个粒子,剩余数量限制在此范围内,因此“丢失”

您有四个组件RGBA,因此可以处理四个属性。但在FBO中可以有多个渲染缓冲区


您可以通过
glReadPixels
读取FBO。如果您使用FBO而不是默认的帧缓冲区,请先使用
GL\u COLOR\u ATTACHMENTi

也许这篇文章会对您有所帮助。或者简单地创建一个具有所需网格分辨率的纹理,并增加种子点所在像素的颜色。在此之前,您的数据集被标准化为[0,1]坐标(当然与您的纹理大小相同)。感谢您的文章,它们看起来很有趣,尽管我的计划有点过于复杂。不过我会更仔细地看一看。我希望我可以(ab)在顶点和片段着色器之间使用光栅化步骤,因为这基本上是相同的操作。这是一个选择吗?@meme试试看。。。如果它有效,为什么不:-)SSBO看起来非常适合我的用例,但是如果我理解正确,它是在OpenGL 4.3中实现的。我刚刚发现MacOS显然只支持4.1(比如WTF,真的是苹果?!)。你还有其他建议吗?