Оказывается, я просто идиот; этот код работает нормально, это просто данные, которые были неверны
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<>
для материалов, хотя это не должно иметь значения, не так ли?
Чтобы уточнить, у меня такой вопрос: как мне заставить OpenGL применять несколько материалов на кадр? Должен ли я попробовать VBOs? Я перейду к ним в конце концов, но сейчас все, что мне нужно, - это рабочая реализация.