10

現在、メッシュを入力 (頂点位置と要素配列で構成される) として受け取りglDrawElements()GL_TRIANGLES_ADJACENCYモードで使用するインデックスを出力するプログラムを作成しようとしています。

コードを記述しようとしたときに、閉じていないメッシュには 3 つの隣接要素がない可能性のある三角形があることに気付きました。たとえば、1 つの三角形で構成されるメッシュには隣接する三角形はありません。

OpenGL 4.3 仕様の三角形隣接図。

この場合、インデックス 2、4、および 6 は何になりますか? 隣接する三角形の 1 つ以上が存在しないことをジオメトリ シェーダーに伝える標準的な方法があるはずです。ただし、OpenGL 仕様 (v4.3) でこれに関する情報を見つけることができませんでした。

1 つの三角形はつまらない例ですが、すべての三角形が他の 3 つの三角形に結合しているわけではないメッシュがたくさんあります。たとえば、両端が開いた円柱などです。

このようなケースを処理する標準的な方法はありますか? 仕様で明らかな何かを見逃していた場合は、お詫び申し上げます。

OpenGL 4.3仕様からコピーされた上の画像。

4

3 に答える 3

6

BЈовић へのコメントを読んだ後、あなたが探しているのはプリミティブ リスタート インデックスであることは明らかだと思います。

次の API 呼び出しを使用して、プリミティブの再起動を表す任意のインデックス値を予約できますglPrimitiveRestartIndex (...)-1元の質問のように、よく使用されます。

詳しくは、OpenGL 4.3 Core Specification - 10.3.5 Primitive Restart - pp. 301 をご覧ください。

また、インデックスベースのプリミティブ再起動は有効/無効にできる機能であり、最初は無効になっていることも指摘しておく必要があります。したがって、単に再起動インデックスを設定するだけでは、実際に何かを行うには十分ではありません。

于 2013-09-27T00:19:51.050 に答える
2

これは簡単に解決できる問題ではありません。一般的に言えば、GS に隣接情報が必要な場合は、隣接する頂点情報を使用して新しい三角形データを生成する GS ベースのテッセレーションなどを行っている可能性があります。

隣接する頂点情報がない場合は、テッセレーション アルゴリズムで解決策を探す必要があります。多くのアルゴリズムには、隣接する三角形がない場合を処理する方法があります。一部のテッセレーション アルゴリズムはそうではありません。完全に規則的なメッシュでのみ機能します。

そのような場合、問題があります。三角形が隣接していないエッジは、おそらく鋭いエッジであると考えられます。したがって、テッセレーション アルゴリズムでシャープなエッジを作成する方法がない場合は、それを変更してそのようなものを作成する必要があります。

それができない場合は、いつでもファントム頂点を生成できます。たとえば、ダイアグラムに頂点 6 がないとします。頂点 1 と 5 によって作成された線の中点を介して、頂点 3 をミラーリング/投影することにより、頂点 6 のデータを作成できます。通常のメッシュ。

繰り返しますが、これがどの程度見栄えがよいかは、テッセレーション アルゴリズムと目的の結果によって異なります。

于 2018-03-02T15:31:40.363 に答える
-1

十分な頂点を提供しないと、何もレンダリングされません。つまり、 に提供する頂点が 6 つ未満の場合、GL_TRIANGLES_ADJACENCYレンダリングされません。

これに対する最も簡単なテストは、mode=GL_LINESandを使用することcount=1です。

于 2013-09-26T19:21:40.347 に答える