GPU上的纹理图像处理?

Posted

技术标签:

【中文标题】GPU上的纹理图像处理?【英文标题】:Texture Image processing on the GPU? 【发布时间】:2010-09-30 05:38:09 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

    将某些东西渲染到纹理中。 使用读取纹理并执行一些操作的着色器绘制全屏四边形。

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

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

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

尽管如此,在上述所有情况下,每个输出像素都应该独立于其他输出像素。它可以多使用一个输入像素就好了。

一个不能很好映射的处理操作的例子是 Summed Area Table,其中每个输出像素都依赖于输入像素和相邻输出像素的值。尽管如此,仍然可以在 GPU (example pdf) 上执行这些操作。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于GPU上的纹理图像处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NVIDIA GPU 上处理来自 CPU 的 RGB 数据并使用 OpenGL 纹理可视化数据

OpenGL纹理内存布局和查找速度

现代 GPU 上的纹理更改(和其他状态更改)成本

WebGL - 发送数组缓冲区 VS 将图像/画布/位图从 CPU 发送到 GPU

OpenGL ES 压缩纹理

CUDA/OpenGL InterOp:使用灰度图像作为纹理