Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GPU上的纹理图像处理?_Opengl_Image Processing_Gpu_Textures - Fatal编程技术网

Opengl GPU上的纹理图像处理?

Opengl GPU上的纹理图像处理?,opengl,image-processing,gpu,textures,Opengl,Image Processing,Gpu,Textures,我将某个场景渲染成纹理,然后我需要以某种简单的方式处理该图像。我现在要做的是使用glReadPixels()读取纹理,然后在CPU上进行处理。但是这太慢了,所以我想把处理移到GPU上 我能想到的最简单的设置就是显示一个简单的白色四边形,在正交投影中占据整个视口,然后将图像处理位作为片段着色器写入。这将允许许多处理实例并行运行,并访问处理所需的纹理的任何像素 这是一个可行的行动方案吗?这样做很普遍吗? 有没有更好的方法呢?是的,这是通常的做法 把某物渲染成纹理 绘制一个带有着色器的全屏四边形,该着

我将某个场景渲染成纹理,然后我需要以某种简单的方式处理该图像。我现在要做的是使用
glReadPixels()
读取纹理,然后在CPU上进行处理。但是这太慢了,所以我想把处理移到GPU上

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

这是一个可行的行动方案吗?这样做很普遍吗?
有没有更好的方法呢?

是的,这是通常的做法

  • 把某物渲染成纹理
  • 绘制一个带有着色器的全屏四边形,该着色器读取该纹理并执行一些操作
  • 通过读取片段着色器中的一个像素并输出一个像素,可以实现简单效果(例如灰度、颜色校正等)。通过从偏移位置读取一个像素并输出一个像素,可以完成更复杂的操作(例如旋转模式)。甚至更复杂的操作可以通过读取多个像素来完成

    在某些情况下,需要多个临时纹理。例如,高半径的模糊通常通过以下方式进行:

  • 渲染成纹理
  • 渲染到另一个(较小)纹理,使用着色器将每个输出像素计算为多个源像素的平均值
  • 使用这个较小的纹理渲染到另一个较小的纹理中,使用一个进行适当高斯模糊或其他操作的着色器
  • 。。。重复
  • 但在上述所有情况下,每个输出像素都应该独立于其他输出像素。它可以使用一个或多个输入像素


    映射不好的处理操作的一个例子是求和面积表,其中每个输出像素取决于输入像素和相邻输出像素的值。不过,在GPU()上也可以进行这些操作。

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