c++ - 使用 OpenGL 比较两个图像

标签 c++ performance opengl graphics

我正在编写一个程序来绘制一些应该模仿输入(光栅)图像的多边形。绘制形状后,我需要将我的渲染图像与输入图像进行比较,然后决定是否达到我的目标。目前我正在使用 CIMG 库来绘制。整个程序在 CPU 上运行。我尝试使用使用 OpenGL 进行绘图的 SFML - 渲染速度非常快,但是将图像从 GPU 复制到 CPU(与输入图像进行比较)需要很长时间。 我想:

  • 在 GPU 上渲染多边形
  • 将输入(光栅)图像发送到 GPU
  • 使用简单的“逐个像素”比较在 GPU 上比较图像: (r1-r2)^2+(g1-g2)^2+(b1-b2)^2
  • 发送比较结果(一个数) 到 CPU

不幸的是,我不知道它(比较两个图像)是否可以通过 OpenGL 实现。如果可能的话,我将学习 OpenGL 或任何其他可以非常快速地完成我的任务的库。

最佳答案

以下是一种可能的方法的概述。它们实际上只是帮助您入门的提示。

  1. 将您的图像渲染到纹理(我将其称为 Render)并将原始图像复制到另一个纹理(我将其称为 Orig)。禁用任何纹理过滤。

  2. 创建一个片段着色器来计算差异。在伪代码中:

    vec3 render = texture2D(Render, fragmentPosition.xy);
    vec3 orig = texture2D(Orig, fragmentPosition.xy);
    gl_FragColor.r = (render - orig).dot(render - orig);
    

    在图像大小的四边形上运行此片段着色器,将输出发送到另一个纹理(我将其称为Difference)。您可能需要启用矩形纹理。

  3. 创建另一个片段着色器来计算部分和:

    float sum = 0;
    for (row = 0; row < imageHeight; ++row) {
      sum += texture2D(Difference, vec2(fragmentPosition.x, row));
    }
    gl_FragColor.r = sum;
    

    在四边形大小的 image_width x 1 上运行此片段着色器,将输出发送到另一个纹理 (PartialSum)。

  4. 要么将 PartialSum 读回到 CPU(它要小得多)并在那里求和,要么创建一个单片段四边形并运行修改后的求和着色器以获得一个数字,比读回去。

关于c++ - 使用 OpenGL 比较两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125140/

相关文章:

c++ - 如何在C++中继承类?

c++ - 使用 IDispatch::Invoke 的 OLE 交互参数构造

.net - 用于性能基准测试的 Visual Studio 加载项

C++ 搜索性能

c++ - 用于桌面 VR 的 OpenGL 非对称截锥体

opengl - 如何用opengl画螺旋线

c++ - 如何找到8?16?32? opencv中的位图?

c++ - 函数指针的通用映射。有可能吗?还有其他选择吗?

performance - 在自定义分布之后绘制随机数

c++ - 使用 GLM 围绕点进行 OpenGL 旋转