4

glDrawElements を使用して三角形のメッシュを描画しており、マウス クリックを使用して三角形を選択/選択できるようにしたいと考えています。三角形のメッシュは非常に大きくなる可能性があります。

固定機能の OpenGL では、GL_SELECT を使用する可能性があります: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking .. ただし、OpenGL コア プロファイルの使用にのみ関心があります。

別の可能性は、「カラーコーディング」を使用することです。

http://www.lighthouse3d.com/opengl/picking/index.php?color1

http://www.opengl.org/resources/faq/technical/selection.htm

..しかし、私が知る限り、glDrawElementsを使用する場合、三角形ごとの情報をまだ示すことはできませんか?

最後に、マウスの位置からピック レイを発射することで CPU ベースのピッキングを行うことができましたが、CPU で三角形を変換する必要があると思われるため、これは非常に遅くなるため、GPU ベースのソリューションを使用することをお勧めします。

OpenGL コア プロファイルで glDrawElements を使用する場合に最適な選択方法について誰か提案がありますか?

4

3 に答える 3

5

「カラーコーディング」アプローチについては、gl_PrimitiveIDを使用して、適切なフラグメントシェーダーを使用してカラーコード化されたバッファーを埋めることができます。これにより、基本的に、描画された三角形のインデックスが得られます。

CPU ベースのピッキングについては、加速構造を処理する既存のライブラリと、BulletOpcodeなどのレイメッシュ交差を使用できます。

あなたにとって「最適な」オプションは、ユースケースによって異なり、わかりにくいです。

于 2012-01-31T12:45:49.843 に答える
3

この観点から見てみてください: OpenGL は描画のみを目的としています。ピッキングは別の方法で行う必要があります。そのために OpenGL を使用することを主張する場合 (不合理ではありません)、オブジェクト ID をレンダリングする整数 16 ビットの単一チャネル カラー バッファー アタッチメントを備えた FBO を使用します。ピッキングは、ID の 1 ピクセルを読み取るために削減されます。

最後に、マウスの位置からピック レイを発射することで CPU ベースのピッキングを行うことができましたが、CPU で三角形を変換する必要があると思われるため、これは非常に遅くなるため、GPU ベースのソリューションを使用することをお勧めします。

これをお勧めします。ただし、すべての三角形を変換する代わりに、1 つのピッキング レイを逆変換するだけです。とにかく、空間的な細分化構造でシーンを管理する必要があるため、それに対するテストは簡単です。

于 2012-01-31T15:38:10.670 に答える
2

確かに、DrawElements呼び出しで三角形ごとの情報を提供できます。次に、対応する配列(以前のCOLOR_ARRAY、TEXTURE_COORD_ARRAYなど、現在は一般的にVertexAttribArraysと呼ばれています)を提供する必要があります。GPUを主張する場合、これはおそらく最も簡単な解決策です。

ただし、通常は、クリックポイントからシーンに光線を発射する方法があります。したがって、あなたがしなければならないことは、各三角形を変換することではなく、光線と三角形の間の交差テストを計算することです。光線が交差する場合は、ヒットしませんでしたが、交差しない場合はヒットします。総当たり攻撃を行うと、これにはかなりのコストがかかる可能性があります。

ただし、通常は、たとえば八分木(http://en.wikipedia.org/wiki/Octree)のように、三角形がいくつかの空間データ構造内に含まれます(つまり、シーングラフにはいくつかの表現が含まれます/できます/必要があります)。これにより、かなりの数のテストで衝突応答が可能になります。さらに、三角形が画面上で占める最終的なサイズを考慮に入れることができます(したがって、ほとんどの場合、サブピクセルの三角形を選択することはまったく意味がありません)。

また、本当に凝ったものにしたい場合は、プロセス全体をGPUに配置することもできます(興味深いと思われる例の1つは、たとえばhttp://blog.xeolabs.com/ray-picking-in-scenejsですが、あなたがグーグルを使うとき、もっと出てくる)。

私が個人的に実装するのが最も簡単なのは、ソリューションb)ソフトウェアレイピッキング、次にa)そして最後にGPUピッキングです。最も簡単なものから始めて、十分に速くないとわかった場合は改善します。時期尚早の最適化にとらわれないでください(たとえば、レイキャストピッキングは私のiPhoneで完全に機能します;)。ピッキングアルゴを楽しんで頑張ってください。

于 2012-01-31T12:41:15.737 に答える