Assimp ライブラリを使用して Wavefront オブジェクト ファイル (.obj) をインポートすると、特定の頂点が 2 倍になるのはなぜだろうと思っていたのですが、Assimp SourceForge のディスカッション ( http://sourceforge.net/p/assimp/discussion/ ) で次の回答を見つけました。 817654/スレッド/026e9640/?limit=25#ba6c ):
次のことを想像してください: ある範囲の頂点をグラフィックス カードにアップロードします。次に、インデックス バッファーを介して GPU に、頂点 3、6、および 7 によって形成される最初の三角形を指示します。2 番目の三角形は、1、2、および 6 です。何が起こるでしょうか? GPU は立方体を描画しますが、立方体の各コーナーは同じ UV データ、法線ベクトル、頂点カラー、またはメッシュが必要とするその他のものを共有します。
では、どのように立方体のコーナーを取得し、そのコーナーに接するすべての面で異なる UV マッピングを取得するのでしょうか? GPU に「頂点 3 を使用するように指示することはできませんが、その頂点の UV 座標の代わりに UV 座標を使用してください」。GPU はこれを行うことができません。そのため、そのコーナーで頂点を複製する必要があります。同じ位置に 2 つの頂点がありますが、UV 座標は異なります。
それがAssimpがあなたのためにしていることです。JoinIdenticalVertices を指定すると、24 個の頂点を持つ立方体が得られます。なんで?立方体には 8 つの角がありますが、各角には 3 つの立方体の側面が接触しており、その角のそれぞれに異なる UV 座標が設定されているため、各角の 3 つのバージョンになります。JoinIdenticalVertices を指定しない場合、再利用のない単純な頂点の配列が得られます。つまり、立方体の各辺にそれぞれ 3 つの頂点を持つ 2 つの三角形が必要で、最終的に 36 の頂点になります。
別の方法として、3D uv 座標とキューブ マップを使用して、そのキューブをテクスチャリングすることもできます。これはキューブに対してのみ機能する特殊なケースですが、キューブでも機能します。GPU は内部で 6 つのテクスチャへのマッピングを行います。上記の説明は一般的なケースであり、遭遇する可能性のあるすべてのメッシュでこのように機能します。
それは理にかなっています。
MeshLab が .obj インポート操作をどのように処理するかわからないことを前提として、私が見つけた答えが正しければ、そのようなオブジェクトをインポートしたときに頂点カウンターが増加しないのはなぜですか? 法線/接線/UV がある場合に、頂点を分割せずに .obj ファイルをインポートする方法はありますか?