0

私は週末に、学校用に開発した単純な Waveform OBJ インポーターを使って実験していました。それをしている間、私は glDrawArrays と glDrawElements について読み、後者が頂点を再描画するのではなく簡単にアクセスできるようにバッファーに保持することで前者よりも優れている方法を読みました。頂点、テクスチャ、および法線配列を並べ替えて両方を使用するための簡単なアルゴリズムを開発しました。ただし、gDE を使用する場合、3 つのバッファすべてに同じインデックスを使用するため、同じ頂点を別の法線やテクスチャに関連付けることはできません。したがって、異なるポリゴン上に描画された頂点は、OBJ に最初に表示されたときと同じテクスチャを保持します。これは、必要な法線/テクスチャ値を使用して、必要に応じて同じ頂点をバッファに n 回書き込むことで解決できます。でも、このソリューションは、最終的なバッファー結果を、gDA に使用されるのと同じバッファーに変換します。だから、私の質問は: パフォーマンス上の利点はまだありますか? または、この不便さに対する別の解決策はありますか?

4

1 に答える 1

1

3つのバッファすべてに同じインデックスを使用しているため、同じ頂点を別の法線やテクスチャに関連付けることはできません。

あなたはよくある誤解、つまり「頂点」は「位置」に等しいという誤解に陥りました。これはそうではありません!頂点は、位置、法線、テクスチャ座標、および使用する他のすべての属性の全体の組み合わせです。属性の値の1つを変更すると、別の頂点が取得されます。したがって、あなたがしなければならないのは、OBJファイルの面からモデルの実際の頂点を生成することです。

残念ながら、多くの人が "vertex" == "position"という誤解に陥ったため、位置を頂点に誤って置き換える多くのファイル形式や仕様を見つけることができます。たとえば、ウェーブフロントOBJ形式では、位置はvより賢明なの代わりにで定義されvpます。

「頂点」と呼ばれる数学的オブジェクトと位置の違いは、頂点入力として任意の一般的な属性を受け取る頂点シェーダーを提供する必要がある最新のOpenGLで非常に明白になります。これらの属性は、実際には位置である必要はなく、入力から任意の方法でクリップスペースの位置を作成します。

于 2013-02-06T14:40:01.447 に答える