2

OpenGL。1 つの画像を描画し、次に XOR を使用して 2 番目の画像を描画したとします。今、私は黒以外のピクセルを含む黒のバッファをどこかに持っています。シェーダーを使用して 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 つの入力画像がある
  2. オクルージョン クエリをオンにします。
  3. abs( texel1 -texel2) を計算するフラグメント シェーダーを使用して、2 つの画像を画面に描画し (つまり、2 つのテクスチャが設定されたフル スクリーン クワッド)、ピクセルが同じ(差がゼロまたはいくつかのしきい値未満)。おそらく最も簡単なのは、GLSL フラグメント シェーダーを使用することです。そこでは、2 つのテクスチャを読み取り、差の abs() を計算して、ピクセルを破棄します。ここでは、非常に基本的な GLSL の知識で十分です。
  4. クエリを通過したピクセル数を取得します。同じピクセルの場合、クエリはパスしません (ピクセルはシェーダーによって破棄されます)。異なるピクセルの場合、クエリはパスします。

最初は、深度バッファを含むより複雑なアプローチを考えていましたが、ピクセルを殺すだけで十分であることに気付きました。ただし、これが私のオリジナルです(ただし、上記のものはよりシンプルで効率的です):

  1. 2 つの入力画像がある
  2. クリアスクリーンとデプスバッファ
  3. abs(texel1-texel2) を計算するフラグメント シェーダーを使用して、2 つの画像を画面に描画します (つまり、2 つのテクスチャが設定されたフル スクリーン クワッド) 。ピクセルが異なる場合はピクセルを削除します (GLSL では破棄)。クワッドを描画して、深度バッファー値が平面に近いものになるようにします。
  4. このステップの後、深度バッファーには、同じピクセルの小さな深度値と、異なるピクセルの大きな (ファー プレーン) 深度値が含まれます。
  5. オクルージョン クエリをオンにして、奥行きがファー プレーンよりも近く、前のクワッドよりも大きい別のフル スクリーン クワッドを描画します。
  6. クエリを通過したピクセル数を取得します。同じピクセルの場合、クエリはパスしません (深度バッファーは既に近づいています)。異なるピクセルの場合、クエリはパスします。これを取得するには SAMPLES_PASSED_ARB を使用します。CodeSampler.comには、開始するためのオクルージョン クエリの例があります。

もちろん、これにはオクルージョン クエリをサポートする GPU が必要です。2002 年以降のほとんどの GPU は、一部のローエンドのもの (特に、Intel 915 (別名 GMA 900) および Intel 945 (別名 GMA 950)) を除いて、それをサポートしています。

于 2008-09-19T05:49:11.013 に答える