2011-08-04 111 views
2

原来我只是被白痴;此代码工作正常,它只是是不正确的数据只有一个材料

注:如果@ 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

我们需要看到其中的渲染代码被称为上下文。可能会有一些状态被设置,这与您的需求相冲突。 – datenwolf

+0

@datenwolf我的问题现在很长,但有代码。如果您需要更多/更少,请告诉我。 – Bojangles

回答

1

我假设第一个片段的环路内,或得到由model_draw调用。但是,如果我知道渲染循环的上下文(渲染循环所在的函数),这将有所帮助。

因此有两个基本的错误,没有直接关系呈现一个特定的模式,而是改造安装。

你叫gluLookAtdrawScene开始,但让它适用于任何基质是有效的。 gluLookAt正在使用modelview矩阵。 投影就像“镜头”;操纵投影矩阵正在移动镜头,将胶片/传感器留在原地。你也应该在drawScene函数中设置投影。从技术上讲,你在“初始化”函数中所做的所有事情,实际上应该在每次渲染迭代开始时完成;您将在整个渲染过程中多次切换这些状态。

通常的顺序是

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() 
+0

感谢datenwolf,但是我现在的代码工作正常的代码没有。现在它不是一个优先事项,但我一定会考虑让我的代码正确。谢谢。可惜它并不能解决我的问题。 – Bojangles

+0

@JamWaffles:我能想到的唯一的事情就是,你在某个地方搞乱了你的OpenGL状态。例如,如果你做了一个glEnable(GL_COLOR_MATERIAL);每次调用glColor都会搞乱你的素材设置。 – datenwolf