GPU上的纹理图像处理?

时间:2009-01-08 09:16:14

标签: opengl image-processing gpu textures

我将某个场景渲染到纹理中,然后我需要以一种简单的方式处理该图像。我现在这样做的方法是使用glReadPixels()读取纹理,然后在CPU上处理它。然而这太慢了,所以我在考虑将处理转移到GPU。

我能想到的最简单的设置是显示一个简单的白色四边形,它在正交投影中占据整个视口,然后将图像处理位写为片段着色器。这将允许许多处理实例并行运行,以及访问处理所需的纹理的任何像素。

这是一个可行的行动方案吗?以这种方式做事常见吗? 有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

是的,这是通常的做事方式。

  1. 将某些内容渲染为纹理。
  2. 使用着色器绘制全屏四边形,该着色器读取该纹理并执行一些操作。
  3. 简单效果(例如灰度,颜色校正等)可以通过读取一个像素并在片段着色器中输出一个像素来完成。可以通过从偏移位置读取一个像素并输出一个像素来完成更复杂的操作(例如旋转图案)。通过读取多个像素,可以完成更复杂的操作。

    在某些情况下,需要多个临时纹理。例如。高半径的模糊通常以这种方式完成:

    1. 渲染为纹理。
    2. 渲染为另一个(较小的)纹理,使用着色器将每个输出像素计算为多个源像素的平均值。
    3. 使用这个较小的纹理渲染成另一个小纹理,使用着色器进行适当的高斯模糊处理。
    4. ...重复
    5. 在所有上述情况中,每个输出像素应独立于其他输出像素。它可以使用更多的输入像素。

      不能很好地映射的处理操作的示例是Summed Area Table,其中每个输出像素取决于输入像素和相邻输出像素的值。不过,可以在GPU上进行这些操作(example pdf)。

答案 1 :(得分:2)

是的,这是进行图像处理的常规方法。如果您要为每个像素设置颜色,则四边形的颜色并不重要。根据您的应用,您可能需要注意像素采样问题(即确保您从源纹理上的正确像素进行采样,而不是在两个像素之间进行采样)。