Opengl 如何在GPU上进行像素排序

Opengl 如何在GPU上进行像素排序,opengl,glsl,Opengl,Glsl,我想知道如何在GPU上进行像素排序。正如我通过不同的教程所理解的,片段着色器无法使用或操纵当前像素周围的像素。但是有一些模糊着色器能够通过平均当前处理像素周围的像素来进行高斯模糊 我必须如何实现这样的算法,我需要将当前着色器的输出输入到自身还是另一个着色器中 提前谢谢 但是有一些模糊着色器能够通过平均当前处理像素周围的像素来进行高斯模糊 您不能写入任意像素,但通过采样器(纹理或图像访问)可以读取任意像素,这就是模糊着色器所需的全部内容 但是有一些模糊着色器能够通过平均当前处理像素周围的像素来进行

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

我必须如何实现这样的算法,我需要将当前着色器的输出输入到自身还是另一个着色器中

提前谢谢

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

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

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

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

介绍了GPU上的排序

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

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

如果每个输出像素仅访问2个输入像素,则可以有效地“交换”每个过程上的一对相邻像素。这可能需要多达N个过程才能将像素移动N步。(您可以使用遮挡查询提前计算交换和“断开”)

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

但真正的高性能解决方案来自于实现比气泡排序更智能的算法。GPU Gems的文章建议使用双音合并排序,即使是heapsort和quicksort也可以非常巧妙地实现

但是要成功地为GPU算法设计出一个高效的实现,还有很多需要知道的事情——比这里可以快速讨论的要多。您可能希望使用CUDA实现,而不是glsl。但是,还有银行冲突、扭曲、缓存、采样和刷卡。没有快速的答案

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

描述了GPU上的排序

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

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

如果每个输出像素仅访问2个输入像素,则可以有效地“交换”每个过程上的一对相邻像素。这可能需要多达N个过程才能将像素移动N步。(您可以使用遮挡查询提前计算交换和“断开”)

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

但真正的高性能解决方案来自于实现比气泡排序更智能的算法。GPU Gems的文章建议使用双音合并排序,即使是heapsort和quicksort也可以非常巧妙地实现

但是要成功地为GPU算法设计出一个高效的实现,还有很多需要知道的事情——比这里可以快速讨论的要多。您可能希望使用CUDA实现,而不是glsl。但是,还有银行冲突、扭曲、缓存、采样和刷卡。没有快速的答案


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

您想使用OpenGL还是GPU?对于这种情况,您可以更好地使用OpenCL或CUDA。你想实现中值滤波吗?没关系,我使用的是openframeworks,所以里面支持的所有东西都很好:D.你想使用OpenGL还是GPU?对于这种情况,您可以更好地使用OpenCL或CUDA。你想实现中值滤波吗?其实没关系,我使用的是openframeworks,所以里面支持的所有东西都很好:D.答案很好,听起来也有点吓人;D(对于初学者)。不管怎样,我都会看那一章。如果没有其他选择,我们将接受答案。谢谢你!回答得很好,听起来也有点吓人;D(对于初学者)。不管怎样,我都会看那一章。如果没有其他选择,我们将接受答案。谢谢你!