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

Wan*_*ong 2 opengl glsl compute-shader

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

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

我最初的想法是使用一个shader存储缓冲区,将其绑定到GLSL中的一个数组,其大小为totalTriangleNum,然后在shader中遍历ID纹理,将索引等于ID的数组元素加1质地。

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

dat*_*olf 5

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

鉴于您对数据的描述,让我重新表述一下:

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

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

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

这是 AMD GPU 研究人员撰写的一篇不错的论文:https : //developer.amd.com/wordpress/media/2012/10/GPUHistogramGeneration_preprint.pdf