質問

OpenGL。1 つのイメージを描画し、次に XOR を使用して 2 番目のイメージを描画したとします。今、どこかに黒以外のピクセルを含む黒バッファーがあります。シェーダーを使用して GPU で黒 [ rgb(0,0,0) ] ピクセルをカウントできると読みました。

また、OcclusionQuery と関係があるとも読みました。http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

それは可能ですか?またその方法は?[任意のプログラミング言語]

OpenGL/GPU を介して類似性を見つける方法について別のアイデアをお持ちであれば、それも素晴らしいことです。

役に立ちましたか?

解決

XORビットをどのように実行するのかわかりません(少なくとも遅いはずです。現在の GPU がそれを加速するとは思えません)、しかし私のアイデアは次のとおりです。

  1. 2 つの入力画像がある
  2. オクルージョンクエリをオンにします。
  3. 2 つのイメージを画面に描画します (つまり、2 つのテクスチャがセットアップされたフル スクリーン クワッド)、abs(texel1-texel2) を計算し、ピクセルをキルするフラグメント シェーダーを使用します (破棄 GLSL では) ピクセルが次の場合 同じ (差がゼロか、あるしきい値を下回っています)。おそらく最も簡単なのは、GLSL フラグメント シェーダを使用することです。そこでは 2 つのテクスチャを読み取り、差分の abs() を計算してピクセルを破棄するだけです。ここでは、非常に基本的な GLSL の知識があれば十分です。
  4. クエリを通過したピクセル数を取得します。ピクセルが同じである場合、クエリは合格しません (ピクセルはシェーダーによって破棄されます)。ピクセルが異なる場合、クエリは合格します。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top