XORビットをどのように行うかはわかりませんが(少なくとも遅いはずです。現在のGPUがそれを加速するとは思いません)、私の考えは次のとおりです。
- 2 つの入力画像がある
- オクルージョン クエリをオンにします。
- abs( texel1 -texel2) を計算するフラグメント シェーダーを使用して、2 つの画像を画面に描画し (つまり、2 つのテクスチャが設定されたフル スクリーン クワッド)、ピクセルが同じ(差がゼロまたはいくつかのしきい値未満)。おそらく最も簡単なのは、GLSL フラグメント シェーダーを使用することです。そこでは、2 つのテクスチャを読み取り、差の abs() を計算して、ピクセルを破棄します。ここでは、非常に基本的な GLSL の知識で十分です。
- クエリを通過したピクセル数を取得します。同じピクセルの場合、クエリはパスしません (ピクセルはシェーダーによって破棄されます)。異なるピクセルの場合、クエリはパスします。
最初は、深度バッファを含むより複雑なアプローチを考えていましたが、ピクセルを殺すだけで十分であることに気付きました。ただし、これが私のオリジナルです(ただし、上記のものはよりシンプルで効率的です):
- 2 つの入力画像がある
- クリアスクリーンとデプスバッファ
- abs(texel1-texel2) を計算するフラグメント シェーダーを使用して、2 つの画像を画面に描画します (つまり、2 つのテクスチャが設定されたフル スクリーン クワッド) 。ピクセルが異なる場合はピクセルを削除します (GLSL では破棄)。クワッドを描画して、深度バッファー値が平面に近いものになるようにします。
- このステップの後、深度バッファーには、同じピクセルの小さな深度値と、異なるピクセルの大きな (ファー プレーン) 深度値が含まれます。
- オクルージョン クエリをオンにして、奥行きがファー プレーンよりも近く、前のクワッドよりも大きい別のフル スクリーン クワッドを描画します。
- クエリを通過したピクセル数を取得します。同じピクセルの場合、クエリはパスしません (深度バッファーは既に近づいています)。異なるピクセルの場合、クエリはパスします。これを取得するには SAMPLES_PASSED_ARB を使用します。CodeSampler.comには、開始するためのオクルージョン クエリの例があります。
もちろん、これにはオクルージョン クエリをサポートする GPU が必要です。2002 年以降のほとんどの GPU は、一部のローエンドのもの (特に、Intel 915 (別名 GMA 900) および Intel 945 (別名 GMA 950)) を除いて、それをサポートしています。