opengl - GPU上的纹理图像处理?

标签 opengl image-processing gpu textures

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

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

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

最佳答案

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

  • 将某些东西渲染成纹理。
  • 绘制一个带有着色器的全屏四边形,该着色器读取该纹理并执行一些操作。

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

    在某些情况下,需要多个临时纹理。例如。高半径模糊通常是这样完成的:
  • 渲染成纹理。
  • 渲染到另一个(较小的)纹理中,使用着色器将每个输出像素计算为多个源像素的平均值。
  • 使用这个较小的纹理渲染成另一个小纹理,使用一个可以进行适当的高斯模糊或其他东西的着色器。
  • ...重复

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

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

    关于opengl - GPU上的纹理图像处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/423663/

    相关文章:

    opengl - GLSL 2.0属性问题

    c# - C#上的灰度共生矩阵法

    javascript - 半透明点上的附加颜色

    python - 在 Google Colaboratory 上使用 GPU 运行 LightGBM/LGBM

    c++ - 如何正确渲染 3ds 文件中的面孔

    opengl - 如何有效地将texture1复制到texture2?

    Opengl 简单片段着色器在纹理上叠加半透明三角形带

    c++ - OpenCV findContours 问题

    linux - nvcc 致命 : Unsupported gpu architecture 'compute_20' while compiling matlab

    c++ - 部署跨 GPU 系列 GPU 代码的当前实践