计算GPU上的图像相似性[OpenGL/OccessionQuery]

计算GPU上的图像相似性[OpenGL/OccessionQuery],opengl,shader,pyopengl,occlusion,Opengl,Shader,Pyopengl,Occlusion,OpenGL。假设我画了一幅图像,然后用XOR画了第二幅。现在我在某个地方有了带有非黑色像素的黑色缓冲区,我读到我可以使用着色器来计算GPU上的黑色[rgb(0,0,0)]像素 我还读到它与oclusionquery有关。 有可能吗?怎么可能?[任何编程语言] 如果你对如何通过OpenGL/GPU找到相似性有其他想法,那也太好了。我不确定你是如何实现XOR位的(至少它应该很慢;我不认为当前的GPU会加速这一点),但我的想法是: 有两个输入图像 启用遮挡查询 使用计算abs(texel1-tex

OpenGL。假设我画了一幅图像,然后用XOR画了第二幅。现在我在某个地方有了带有非黑色像素的黑色缓冲区,我读到我可以使用着色器来计算GPU上的黑色[rgb(0,0,0)]像素

我还读到它与oclusionquery有关。

有可能吗?怎么可能?[任何编程语言]


如果你对如何通过OpenGL/GPU找到相似性有其他想法,那也太好了。

我不确定你是如何实现XOR位的(至少它应该很慢;我不认为当前的GPU会加速这一点),但我的想法是:

  • 有两个输入图像
  • 启用遮挡查询
  • 使用计算abs(texel1-texel2)的片段着色器将两个图像绘制到屏幕上(即设置了两个纹理的全屏四边形),如果像素相同(差值为零或低于某个阈值),则杀死像素(在GLSL中丢弃)。最简单的方法可能只是使用GLSL片段着色器,在这里您只需读取两个纹理,计算差值的abs(),然后丢弃像素。非常基本的GLSL知识在这里就足够了
  • 获取通过查询的像素数。对于相同的像素,查询将不会通过(像素将被着色器丢弃),而对于不同的像素,查询将通过
  • 起初我想到了一种更复杂的方法,涉及深度缓冲区,但后来意识到仅仅杀死像素就足够了。以下是我的原创作品(但上面的作品更简单、更有效):

  • 有两个输入图像
  • 清晰屏幕和深度缓冲区
  • 使用计算abs(texel1-texel2)的片段着色器将两个图像绘制到屏幕上(即设置了两个纹理的全屏四边形),如果像素不同,则杀死像素(在GLSL中丢弃)。绘制四边形,使其深度缓冲区值接近平面
  • 在此步骤之后,深度缓冲区将包含相同像素的小深度值,以及不同像素的大(远平面)深度值
  • 启用“遮挡查询”,并绘制另一个全屏四边形,其深度比远平面近,但比上一个四边形大
  • 获取通过查询的像素数。对于相同的像素,查询将不会通过(深度缓冲区已经更近),而对于不同的像素,查询将通过。你可以用通过的样品来得到这个。在上有一个遮挡查询示例,可以帮助您开始

  • 当然,所有这些都需要GPU和遮挡查询支持。自2002年以来,除了一些低端GPU(特别是Intel 915(又名GMA 900)和Intel 945(又名GMA 950))之外,大多数GPU都支持这一点。

    好吧,是的,这和我的想法差不多,但网络上有没有代码示例?特别是对于“计算abs(texel1-texel2)”和“通过查询的像素数”。@yoihj:这是非常基本的GLSL和遮挡查询用法。查找任何GLSL教程,我已经添加了一个到遮挡查询示例的链接。