2

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

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

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

4

1 回答 1

6

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

  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. 要么读回PartialSumCPU(它要小得多)并在那里求和,要么创建一个单片段四边形并运行修改后的求和着色器以得到一个数字,而不是读回那个数字。

于 2013-06-15T16:22:54.450 回答