2009-01-08 110 views
6

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

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

这是一个可行的做法吗?这种做法很普遍吗? 有没有更好的方法来做到这一点?

回答

2

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

  1. 将某些东西渲染为纹理。
  2. 使用着色器绘制全屏四边形,读取该纹理并执行一些操作。

可以通过读取一个像素并在片段着色器中输出一个像素来完成简单的效果(例如,灰度,色彩校正等)。通过从偏移位置读取一个像素并输出一个像素,可以完成更复杂的操作(例如旋转图案)。通过读取多个像素可以完成更复杂的操作。

在某些情况下,需要多个临时纹理。例如。高半径模糊往往是这样做的:

  1. 渲染成纹理。
  2. 将着色器渲染为另一个(较小)纹理,并将每个输出像素计算为多个源像素的平均值。
  3. 使用这个较小的纹理渲染到另一个小纹理中,并使用着色器进行适当的高斯模糊处理。
  4. ...重复

在所有上述情况下,虽然,每个输出像素应该是独立于其他输出像素。它可以使用更多的输入像素。

无法很好映射的处理操作的示例是求和面积表,其中每个输出像素取决于输入像素和相邻输出像素的值。不过,在GPU上可以做到这些(example pdf)。

2

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