GPU上的纹理图像处理?

sho*_*osh 6 opengl textures gpu image-processing

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

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

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

NeA*_*RAZ 2

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

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

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

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

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

但在所有上述情况下,每个输出像素应该独立于其他输出像素。它可以再使用一个输入像素就可以了。

不能很好映射的处理操作的一个示例是求和区域表,其中每个输出像素取决于输入像素和相邻输出像素的值。尽管如此,仍然可以在 GPU 上执行这些操作(示例 pdf)。