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

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

这可能吗?如何实现?[任何编程语言]

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

有帮助吗?

解决方案

我不确定你如何执行异或位(至少它应该很慢;我认为当前的 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归因
不隶属于 StackOverflow
scroll top