只有一种材质应用于多个对象

时间:2011-08-04 21:57:59

标签: c++ opengl

事实证明我只是个白痴;这段代码工作正常,只是数据不正确

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吗?我将最终转向那些,但现在我想要的只是一个有效的实现。

1 个答案:

答案 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}}