2

3D モデルを含むウェーブフロント .Obj ファイルからデータをレンダリングするために、頂点配列オブジェクト (VAO) で 2 つの頂点バッファー オブジェクト (VBO) と 2 つのインデックス バッファー オブジェクト (IBO) を使用しようとしていました。.obj ファイルは、頂点/法線面の定義を使用していました:

f v1//vn1 v2//vn2 v3//vn3

GL_ELEMENT_ARRAY_BUFFER バインディング ターゲットに (一度に) 1 つのバッファ オブジェクトしかバインドできないため、OpenGL の VAO でのインデックス作成に 2 つの IBO を使用できないことに気付きました。これは、GLSL頂点シェーダーへの入力として両方が必要な場合に問題となる、頂点位置インデックスと頂点法線インデックスを定義することはできないことを意味します。

頂点位置と頂点法線をカプセル化する「Vertex」構造体を使用することを考えましたが、データを 1 つの長い配列以外として OpenGL に供給する方法と、すべての頂点位置データを異なるオブジェクトに持っている場合がわかりません。いくつかのループを使用して、すべての位置データを含む新しい配列にデータをコピーできると思います。

.obj ファイルをロードするときに、法線が対応する頂点位置の値と一致するようにデータを処理できると思います。

この問題を解決するにはどうすればよいですか?

OpenGL 3.3 で C++ と Visual Studio 2012 を使用しています。

4

1 に答える 1

7

理解しなければならないことの 1 つは、「頂点」は「位置」と同義ではないということです。頂点は属性のセット全体です。位置、法線、テクスチャ座標など。OpenGL はジオメトリを一度に 1 つのプリミティブで処理します。プリミティブは 1 つ (点)、2 つ (線)、または 3 つの頂点 (三角形) で構成されます。位置と法線を別々に処理することはできません。常に一緒に処理する必要があります。

OpenGL で処理する前に、.obj ファイル内のデータを展開する必要があります。属性の一意のタプルごとに、新しいインデックスを持つ新しい頂点を導入し、.obj のインデックス付き属性を OpenGL が必要とするインデックス付き頂点に置き換えます。

于 2013-01-03T23:30:35.947 に答える