如何在GPU上进行像素排序

时间:2016-08-03 07:43:42

标签: opengl glsl

我试图弄清楚如何在GPU上进行像素排序。正如我通过我所做的不同教程所理解的那样,片段着色器无法使用或操纵它正在使用的当前像素周围的像素。但是有一些模糊着色器能够通过平均当前处理像素周围的像素来进行高斯模糊。

如何实现这样的算法,是否需要将当前着色器的输出提供给自己或另一个?

提前致谢

2 个答案:

答案 0 :(得分:1)

  

但是有些模糊着色器能够通过平均当前处理像素周围的像素来进行高斯模糊

您无法写入任意像素,但通过采样器(纹理或图像访问),您可以读取任意像素,这就是模糊着色器所需的全部内容。

答案 1 :(得分:1)

GPU Gems 2 Chapter 46描述了在GPU上进行排序。

考虑如何使用冒泡排序算法:

通过访问每个输出像素要排序的列的所有N个像素,它将非常慢,因为每个输出像素读取N(N ^ 2次访问 - 严重受缓存影响)并且这是很多内存访问。但它会起作用,而且这段代码实际上可能最有意义。

如果每个输出像素只能访问2个输入像素,那么您可以在每次传递中有效地“交换”一对相邻像素。这可能需要多达N次通过以将像素移位N步。 (您可以通过使用遮挡查询来计算掉期和“破解”)

通过组合技术,您可以一次采样k个像素,允许像素每次传递最多k步,因此需要N / k次传递并更有效地利用资源。

但真正的高性能解决方案来自实现更智能的算法,而不仅仅是冒泡排序。 GPU Gems文章提出了一种比特排序,甚至可以更加聪明地使用heapsort和quicksort。

但是要成功地为GPU算法实现高效的实现还有很多要知道 - 这里可以快速讨论。你可能想要进行CUDA实现而不是glsl。但随后出现银行冲突,扭曲,缓存,抽样,调整。没有快速的答案。

我建议你试一试,然后在遇到问题时再问一个更具体的问题。