2011-06-28 9 views
7

現在OpenGLで.objローダをプログラミング中です。 VBOに頂点データを格納し、Vertex Attribsを使用してバインドします。法線でも同じです。つまり、通常のデータと頂点データは同じ順序で格納されません。glDrawElements(OpenGL/VBOs)の頂点と法線に別の配列を使用する

メッシュをレンダリングするためにglDrawElementsに与えるインデックスは、OpenGLによって頂点VBOに頂点を取得し、法線VBOで法線を取得するために使用されます。

glBegin/glVertex/glNormal/glEndのほかに、glDrawElementsに、頂点のインデックスと法線の他のインデックスを使用するように指示する方法はありますか? ありがとう

答えて

2

位置/法線/テクスチャ座標などに同じインデックスを使用する必要があります。つまり、.objを読み込むときに、一意の頂点を挿入して面をポイントする必要があります。

7

は、シェーダー内のバッファテクスチャ(OpenGL 3.1機能)にインデックスを付けてシミュレートすることができますが、これを直接行う方法はありません。

このようなことは一般的にはお勧めできません。 OBJ形式では、ある法線を一度に複数の頂点(原則的には任意の数)で参照することができるので、通常、各頂点の座標と法線とテクスチャを含む「完全な」頂点を作成します)。

これは
a)の斜線の表面は正しく
B)ハードエッジが正しく

をレンダリングするレンダリング滑らかことを確実にする(両者の差が同じ共有のみ、いくつかの頂点であり、通常同じ)

+2

「いいえ」と言うとき、私は本当にそれを意味します。ロジックは、適切な頂点のストリームを一度構築してアップロードするよりもはるかに複雑であるだけでなく、順次データアクセスではなくランダムであることを意味します。つまり、すべての頂点でキャッシュミスが多かれ少なかれ保証されます。 – Damon

2

のOpenGL

(position, normal, texcoord[0]…texcoord[n], attrib[0]…attrib[n]) 

という単一の長いベクトルとして頂点を扱い、これらの長いベクトルがインデックスされます。あなたの質問は、複数の法線を持つ共有頂点を使用する方法と同じカテゴリに分類されます。そして、標準的な答えは、それらの頂点は実際には共有されていないということです。なぜなら、長期的には同じではないからです。

だから、面のインデックス配列を反復して、「長い」頂点を構成して一意制約を持つ(新しい)リストに追加する必要があります。頂点→インデックスの(ハッシュ)マップがこのジョブを処理します。このようなもの

next_uniq_index = 0 
for f in faces: 
    for i in f.indices: 
     vpos = vertices[i.vertex] 
     norm = normals[i.normal] 
     texc = texcoords[i.texcoord] 
     vert = tuple(vpos, norm, texc) 
     key 
     if uniq_vertices.has_key(key): 
      uniq_faces_indices.append(uniq_vertices[key].index) 
     else: 
      uniq_vertices[key] = {vertex = key, index = next_uniq_index} 
      next_uniq_index = next_uniq_index + 1 
関連する問題