2016-05-16 49 views
2

我有一个灰度纹理(8000 * 8000),每个像素的值是一个ID(实际上,这个ID是片段所属的三角形的ID,我想用这个方法来计算有多少个三角形和哪个三角形在我的场景中可见)。如何使用GLSL计算指定彩色像素的数量?

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

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

之后,读取缓冲区到OpenGL应用程序,并得到我想要的。这是否是一种有效的方式?还是有一些更好的解决方案,比如计算着色器(以及我不熟悉它)或其他东西。

+0

你所描述一样计算着色器的声音给我。我不知道你想用什么其他类型的着色器。 –

+0

@DietrichEpp我只是想使用片段着色器来做到这一点,而我刚刚听说过计算着色器。 –

+0

片段着色器没有意义,因为您没有进行任何绘制。 –

回答

4

我想用这种方法来计算该三角形多少个三角形是可见的在我的场景)

鉴于你的数据的描述让我重复说了一下:

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

这通常被称为Histogram。不幸的是(对于你)生成直方图是在GPU上不能解决的问题。基本上你必须把你的图像分成更小和更小的子图像(BSP,四叉树等),直到分割成你执行评估的单个像素。然后你回溯传播子直方图,基本上在直方图上执行插入或合并排序。使用GPU生成直方图仍在积极研究中,因此我建议您阅读已发布的学术着作(通常附带源代码)。关键词:直方图,GPU

这一个是由AMD GPU的研究人员做了一个漂亮的纸:https://developer.amd.com/wordpress/media/2012/10/GPUHistogramGeneration_preprint.pdf

+0

感谢您为我提供有关此问题的一些指导。 –

+1

我不会说在GPU上计算直方图很困难。一个非常基本的实现是相当平凡的。挑战只有在试图尽可能高效时才会出现,哪里有各种优化选项,哪种方法效果最好可以取决于硬件。在寻找文献时,直方图就是所谓的“减少操作”的一个例子。所有供应商都应该有关于如何最有效地实施这些技术的白皮书。不过,它们可能比OpenGL更加OpenCL。 –

+0

@ReetoKoradi:请注意,我写了“不平凡解决”,这意味着不同于“困难”。例如,您可以尝试使用着色器中的循环遍历所有像素(tivial解决方案),但是您可能会发现这只会在单个warp/wavefront(即非并行)中执行,并可能会超时。所以你必须改变你的策略,从而变得不平凡。但这并不是一个困难的问题,你不能再以天真的方式去做。 – datenwolf