原来我只是被白痴;此代码工作正常,它只是是不正确的数据只有一个材料
注:如果@ 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的每帧应用多种材料?我应该尝试VBO吗?我将最终转向那些,但现在我想要的只是一个工作实现。
我们需要看到其中的渲染代码被称为上下文。可能会有一些状态被设置,这与您的需求相冲突。 – datenwolf
@datenwolf我的问题现在很长,但有代码。如果您需要更多/更少,请告诉我。 – Bojangles