【问题标题】:How to do particle binning in OpenGL?如何在 OpenGL 中进行粒子分级?
【发布时间】:2018-04-23 11:31:12
【问题描述】:

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

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

【问题讨论】:

  • 也许this 文章会对你有所帮助。或this一个
  • Image Load Store 也很有帮助。
  • 或者简单地创建一个具有所需网格分辨率的纹理,并增加种子点所在像素的颜色。当然,在将数据集标准化为 [0, 1] 坐标之前(与您的相同)纹理大小)。
  • 感谢您的文章,它们看起来很有趣,尽管对于我的计划来说有点过于复杂。不过会更好地看看它们。我希望我可以(ab)使用顶点和片段着色器之间的光栅化步骤,因为这基本上是相同的操作。这会是一个选择吗?
  • @meme 试试看......如果它有效,为什么不:-)

标签: opengl histogram particles binning


【解决方案1】:

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

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

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

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


另一种有限的方法是使用Blending

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

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

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

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

【讨论】:

  • SSBO 看起来非常适合我的用例,但如果我理解正确,它是在 OpenGL 4.3 中实现的。我刚刚发现 MacOS 显然只支持最高 4.1(就像 WTF,真的是 Apple 吗?!)。您还有其他建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多