【问题标题】:How to do pixel sorting on the GPU如何在 GPU 上进行像素排序
【发布时间】:2016-08-04 03:44:08
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 你想使用 OpenGL 还是 GPU?对于这种情况,您可以更好地使用 OpenCL 或 CUDA。是否要实现中值滤波?
  • 没关系,我使用的是openframeworks,所以那里支持的一切都会很棒:D。

标签: opengl glsl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    如果您每个输出像素仅访问 2 个输入像素,那么您可以在每次通过时有效地“交换”一对相邻像素。这可能需要最多 N 次通过才能将像素移出 N 步。 (您可以使用遮挡查询来计算交换并提前“中断”)

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

    但真正的高性能解决方案来自于实施比冒泡排序更智能的算法。 GPU Gems 文章建议使用双调合并排序,甚至堆排序和快速排序也可以非常巧妙地实现。

    但是,要成功地为 GPU 算法设计一个高效的实现,还有很多知识需要了解——这里无法快速进行一般性讨论。而且您可能想要使用 CUDA 实现而不是 glsl。但随之而来的是银行冲突、扭曲、缓存、采样、调配。没有快速的答案。

    我建议你尝试一下,然后在遇到困难时提出更具体的问题。

    【讨论】:

    • 很好的答案,听起来也有点吓人;D(对于初学者)。无论哪种方式,我都会看看那一章。如果此处没有发布任何替代方案,将接受答案。谢谢m8!
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 2018-12-23
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多