我正在编写一个程序来绘制一些应该模仿输入(光栅)图像的plygons。绘制形状后,我需要将我的渲染图像与输入图像进行比较,然后决定是否实现了目标。目前我正在使用CIMG库来绘制。整个程序在CPU上运行。我尝试使用使用OpenGL进行绘图的SFML - 渲染非常快,但是将图像从GPU复制到CPU(与输入图像进行比较)需要很长时间。 我想:
不幸的是,我不知道是否可以通过OpenGL实现它(比较两个图像)。如果可能的话,我将学习OpenGL或任何其他能够快速完成任务的库。
答案 0 :(得分:6)
以下是可能方法的概述。他们真的只是让你入门的秘诀。
将图像渲染为纹理(我将其称为Render
)并将原始图像复制到另一个纹理中(我将其称为Orig
)。禁用任何纹理过滤。
创建一个将计算差异的片段着色器。在伪代码中:
vec3 render = texture2D(Render, fragmentPosition.xy);
vec3 orig = texture2D(Orig, fragmentPosition.xy);
gl_FragColor.r = (render - orig).dot(render - orig);
在图像大小的四边形上运行此片段着色器,将输出发送到另一个纹理(我称之为Difference
)。您可能需要启用矩形纹理。
创建另一个片段着色器以计算部分和:
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
)。
要么回读PartialSum
到CPU(它要小得多)并在那里求和,要么创建单片段四元组并运行修改后的求和着色器以得到一个数字,而不是读回来