如何使用GLSL计算指定彩色像素的数量?

时间:2016-05-16 10:56:21

标签: opengl glsl compute-shader

我有一个灰度纹理(8000 * 8000),每个像素的值是一个ID(实际上,这个ID是片段所属的三角形的ID,我想用这个方法计算多少个三角形和哪些三角形在我的场景中可见。)

现在我需要计算有多少个唯一ID以及它们是什么。我想用GLSL实现这一点,并最大限度地减少GPU RAM和RAM之间的数据传输。

我想出的最初想法是使用着色器存储缓冲区,将其绑定到GLSL中的数组,其大小为totalTriangleNum,然后在着色器中迭代ID纹理,将数组元素增加1,使索引等于纹理中的ID。

之后,将缓冲区读取到OpenGL应用程序并获取我想要的内容。这是一种有效的方法吗?或者是否有更好的解决方案,如计算着色器(我不熟悉它)或其他。

1 个答案:

答案 0 :(得分:4)

  

我想使用此方法计算在我的场景中有多少个三角形和哪些三角形可见

鉴于您对数据的描述,让我稍微改写一下:

您想确定数据集中有多少个不同的值,以及每个值出现的频率。

这通常称为 Histogram 。不幸的是(对你而言)生成直方图是GPU不能轻易解决的问题之一。基本上,您必须将图像分成越来越小的子图像(BSP,四叉树等),直到划分为执行评估的单个像素。然后你回溯传播子直方图,基本上对直方图执行插入或合并排序。

使用GPU生成直方图仍在积极研究中,因此我建议您阅读已发表的学术着作(通常附有源代码)。关键词:直方图,GPU

这是AMD GPU研究人员完成的一篇很好的论文:https://developer.amd.com/wordpress/media/2012/10/GPUHistogramGeneration_preprint.pdf