2

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

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

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

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

4

1 回答 1

2

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

  1. 有两个输入图像
  2. 打开遮挡查询。
  3. 将两个图像绘制到屏幕上(即设置了两个纹理的全屏四边形),使用计算 abs(texel1-texel2) 的片段着色器,如果像素相同(差异为零或低于某个阈值)。最简单的可能只是使用 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))。

于 2008-09-19T05:49:11.013 回答