私はちょうどばかだと分かりました。このコードはうまく動作し、正しくないデータです。複数のオブジェクトに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を試すべきですか?私は最終的にそれらに移動しますが、今、私が望むのは、実用的な実装です。
です。おそらく、あなたの必要と衝突する状態が残っている状態があります。 – datenwolf
@datenwolf私の質問は今や隠されて長いですが、コードがあります。より多くの/少ない必要がある場合は、私に教えてください。 – Bojangles