2011-08-04 34 views
2

私はちょうどばかだと分かりました。このコードはうまく動作し、正しくないデータです。複数のオブジェクトに1つのマテリアルしか適用されていません

N.B. @ datenwolfのコメントや答えが意味をなさないのは、この質問をもう一度開始したからです。フレーズするのは難しいです。

私はOpenGL Wavefontオブジェクトローダーを書いています。私はモデルを読み込んで表示することができますし、材料に対しても同じことをすることができます。私が今実行した問題は、最初のの素材を配列から適用すると、それは後続のすべてのオブジェクトに使用される素材です。

まず、オブジェクト描画コードがあります。これは、ベクトルのベクトル(材料グループを形成する面のグループ)をループします。

typedef struct 
{ 
    GLfloat Ka[3]; 
    GLfloat Kd[3]; 
    GLfloat Ks[3]; 
    float Ns;    // Specular (coeff) 
} 
Material; 

typedef struct 
{ 
    int v1, v2, v3; 
    int vn1, vn2, vn3; 
    int vt1, vt2, vt3; 
} 
Face; 

vector<Material> materials; 
vector< vector<Face> > faces; 

for(int g = 0; g < faces.size(); g++) 
{ 
    // Apply material for this material group 
    glMaterialfv(GL_FRONT, GL_AMBIENT, materials[g].Ka); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, materials[g].Kd); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, materials[g].Ks); 
    glMaterialf(GL_FRONT, GL_SHININESS, materials[g].Ns); 

    glBegin(GL_TRIANGLES); 

    // Loop through faces 
    for(int f = 0; f < faces[g].size(); f++) 
    { 
     glNormal3f(normals[faces[g][f].vn1 - 1].x, normals[faces[g][f].vn1 - 1].y, normals[faces[g][f].vn1 - 1].z); 
     glVertex3f(vertices[faces[g][f].v1 - 1].x, vertices[faces[g][f].v1 - 1].y, vertices[faces[g][f].v1 - 1].z); 

     glNormal3f(normals[faces[g][f].vn2 - 1].x, normals[faces[g][f].vn2 - 1].y, normals[faces[g][f].vn2 - 1].z); 
     glVertex3f(vertices[faces[g][f].v2 - 1].x, vertices[faces[g][f].v2 - 1].y, vertices[faces[g][f].v2 - 1].z); 

     glNormal3f(normals[faces[g][f].vn3 - 1].x, normals[faces[g][f].vn3 - 1].y, normals[faces[g][f].vn3 - 1].z); 
     glVertex3f(vertices[faces[g][f].v3 - 1].x, vertices[faces[g][f].v3 - 1].y, vertices[faces[g][f].v3 - 1].z); 
    } 

    glEnd(); 
} 

@datenwolfが示唆したように、私は他のディレクティブの負荷と一緒にGL_COLOR_MATERIALで物事のすべての種類を試してみました。私は別のプロジェクトで材料の面で機能するいくつかのコードを使用していますので、今私が見ることのできる唯一の問題は材料にvector<>を使用しているという事実です。

明確にするために、私の質問はこれです:フレームごとに複数の材料を適用するにはどうすればよいですか?私はVBOを試すべきですか?私は最終的にそれらに移動しますが、今、私が望むのは、実用的な実装です。

+1

です。おそらく、あなたの必要と衝突する状態が残っている状態があります。 – datenwolf

+0

@datenwolf私の質問は今や隠されて長いですが、コードがあります。より多くの/少ない必要がある場合は、私に教えてください。 – Bojangles

答えて

1

最初のスニペットのループは、内にあるか、model_drawによって呼び出されると仮定します。しかし、私はそのレンダリングループのコンテキスト(レンダーループがある関数)を知っていれば助けになります。

したがって、2つの基本的な間違いがあります。特定のモデルのレンダリングに直接関係するものではなく、変換設定に関するものです。

drawSceneの冒頭にgluLookAtと呼んでいますが、アクティブなマトリックスに適用させてください。 gluLookAtは、modelviewマトリックスで使用されるべきものです。 投影は「レンズ」のようなものです。投影行列を操作することは、レンズを動かして、フィルム/センサを適所に残すことである。また、drawScene関数で投影を設定する必要があります。技術的には、「初期化」機能で行うすべての作業は、実際にはすべてのレンダリング反復の始めに行われるべきです。レンダリング中にこれらの州の多くを複数回切り替えることになります。

通常の順序は、我々はレンダリングコードが呼び出されるコンテキストを参照してくださいする必要があり

glClearColor 
glClearDepth 
glClear(...) 

glViewport(...) 

glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluProjection OR glFrustum OR glOrtho OR custom_projection 

glMatrixMode(GL_MODELVIEW) 
glLoadIdentity() 
gluLookAt OR custom_camera 

render_scene() 
+0

datenwolfに感謝します。ただし、正しいコードではありませんが、現時点でのコードは動作します。今は優先事項ではありませんが、私は間違いなく自分のコードを正しいものにするつもりです。ありがとう。それは私の問題を解決しません恥ずかしいです。 – Bojangles

+0

@JamWaffles:私が考えることができるのは、あなたがどこかOpenGLの状態を混乱させるということだけです。たとえば、glEnable(GL_COLOR_MATERIAL)を実行した場合。 glColorを呼び出すたびに、あなたのマテリアル設定が混乱します。 – datenwolf

関連する問題