4

2D のスプライト ベースのゲームを書いていますが、衝突検出に苦労しています。まず第一に、私は他の方法をよく知っており、実際には、Box2D の quadtree クエリを使用して、重複しないスプライトを除外しています。そのため、ピクセルパーフェクト検出は、オーバーラップが見つかったスプライトでのみ使用され、フレームごとに数回しか使用されませんでした。スプライトは回転していますが、スケーリングはしていません。

問題は、スプライトが時間の経過とともに変化する可能性があり、ビットマップを近似するために Box2D の幾何学的形状を作成および使用することが非常に複雑になるため、ピクセルで行う必要があることです。

私はいくつかの調査を行い、これらの方法が OpenGL で可能であり、ゼロ以外のアルファ チャネルを持つピクセルが重複しているかどうかを確認できることを発見しました。

1)たとえば 50% のアルファと適切なブレンディング機能を使用してスプライトをテクスチャ/バッファにレンダリングし、結果を RAM にコピーして、たとえば 80% より大きいアルファを持つピクセルがあるかどうかを確認します。

この方法は簡単ですが、コピーバックが非常に遅いことを確認しました。

2) OpenGL のオクルージョン クエリを使用します。

ネット オクルージョン クエリでわかったことによると、一部のグラフィック カードでは扱いが難しく (さらに、結果を取得するために次のフレームまで待機する必要がある場合もあります)、バグが発生する可能性があります。そのようなクエリがすぐに結果を生成しないという事実は、ゲームがどのように機能するように設計されているかを考えると、取引を妨げるものです。

3)シェーダーとアトミック カウンター。

それが機能するかどうかはわかりませんが、何かを上書きするたびにアトミックカウンターを増加させる2番目のスプライトをレンダリングするときにフラグメントシェーダーを使用し、CPU側でカウンターの値を確認することが解決策になる可能性があります. 唯一の問題は、アトミック カウンターはかなり新しく、2、3 年前のマシンではサポートされない可能性があることです。

見逃したものはありますか?それとも、GPU の使用を忘れて、CPU での衝突検出のためだけに独自のレンダラーを作成する必要がありますか?

4

1 に答える 1