繁体   English   中英

计算 GPU 上的图像相似度 [OpenGL/OcclusionQuery]

[英]Count image similarity on GPU [OpenGL/OcclusionQuery]

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

我还读到它必须对 OcclusionQuery 做一些事情。 http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

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

如果您对如何通过 OpenGL/GPU 找到相似性有其他想法 - 那也很棒。

我不确定你是如何做 XOR 位的(至少它应该很慢;我认为当前的任何 GPU 都没有加速),但这是我的想法:

  1. 有两个输入图像
  2. 打开遮挡查询。
  3. 两个图像绘制到屏幕(即全屏四与设置了两个纹理),具有片段着色器,其计算ABS(texel1-texel2),并杀死像素(丢弃在GLSL)如果像素是相同的(差零或低于某个阈值)。 最简单的可能只是使用 GLSL 片段着色器,然后您只需读取两个纹理,计算差异的 abs() 并丢弃像素。 非常基本的 GLSL 知识就足够了。
  4. 获取通过查询的像素数。 对于相同的像素,查询不会通过(像素将被着色器丢弃),对于不同的像素,查询将通过。

起初我想到了一种更复杂的方法,涉及深度缓冲,但后来意识到仅仅杀死像素就足够了。 这是我的原版(但上面的更简单,更有效):

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM