事实证明我只是个白痴;这段代码工作正常,只是数据不正确
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每帧应用多种材料?我应该试试VBO吗?我将最终转向那些,但现在我想要的只是一个有效的实现。
答案 0 :(得分:1)
我假设第一个代码段的循环在model_draw
内,或被gluLookAt
调用。但是如果我知道渲染循环的上下文(渲染循环所在的函数),它会有所帮助。
因此,存在两个基本错误,与呈现特定模型无关,而是与转换设置直接相关。
您在drawScene
的开头调用gluLookAt
,但是它适用于任何活跃的矩阵。 drawScene
用于 modelview 矩阵。 投影就像“镜头”;操纵投影矩阵是移动镜头,将胶片/传感器留在原位。您也应该在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()
功能中设置投影。从技术上讲,你在“初始化”函数中所做的所有事情实际上应该在每次渲染迭代的开始时完成;在渲染过程中,您将多次切换其中的许多状态。
通常的顺序是
{{1}}