在GPU上进行纹理图像处理?

6
我正在将一个场景渲染成纹理,然后需要以一些简单的方式处理该图像。我目前的做法是使用glReadPixels()读取纹理,然后在CPU上进行处理。然而这个过程太慢了,所以我考虑将处理移动到GPU上。
我能想到的最简单的设置是显示一个简单的白色四边形,在正交投影中占用整个视口,然后将图像处理部分编写为片段着色器。这将允许许多处理实例并行运行,并访问其所需的任何纹理像素进行处理。
这种方法可行吗?这种做法常见吗?还有更好的方法吗?
2个回答

2

是的,这是通常的做法。

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

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

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

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

但是,在所有上述情况下,每个输出像素都应与其他输出像素无关。它可以很好地使用一个或多个输入像素。

不适合映射的处理操作的示例是总和表,其中每个输出像素都依赖于输入像素和相邻输出像素的值。尽管如此,仍然可以在GPU上执行这些操作(示例pdf)。


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接