照明不适用于OpenGL - 纯色

时间:2013-05-10 16:12:15

标签: c++ opengl lighting

灯光不起作用,物体显示为纯色。颜色本身随着材质或光照参数而变化,但没有阴影或任何纯灰色。

以下是代码的一部分:

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glFrontFace(GL_CCW);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);

GLfloat amb[] = {0.6, 0.6, 0.6, 1.0};
GLfloat dif[] = {0.8, 0.8, 0.8, 1.0};
GLfloat spec[] = {0.5, 0.5, 0.5, 1.0};
GLfloat pos[] = {0.0, 0.0, 30.0};

glEnable(GL_LIGHT0);    

glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
glLightfv(GL_LIGHT0, GL_POSITION, pos);


GLfloat co[4]={0.5, 0.5, 0.5, 0.5};
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 1.0 }; 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, co);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

for(int i=0; i < numofTr; i++)
{       
glBegin(GL_TRIANGLES);
  glNormal3f(tr[i].v1->n.x, tr[i].v1->n.y, tr[i].v1->n.z);
  glVertex3f(tr[i].v1->x, tr[i].v1->y, tr[i].v1->z);    
  glNormal3f(tr[i].v2->n.x, tr[i].v2->n.y, tr[i].v2->n.z);
  glVertex3f(tr[i].v2->x, tr[i].v2->y, tr[i].v2->z);    
  glNormal3f(tr[i].v3->n.x, tr[i].v3->n.y, tr[i].v3->n.z);
  glVertex3f(tr[i].v3->x, tr[i].v3->y, tr[i].v3->z);    
glEnd();
}

我不知道我错过了什么,当与对象一起显示时,法线看起来很好。

1 个答案:

答案 0 :(得分:2)

您正在灰色物体上使用昏暗的灯光。显然结果是灰色的。

如果你的意思是脸部是平面阴影,那是因为glShadeModel(GL_FLAT);。将其更改为GL_SMOOTH以启用插值。

如果对象是3D,我认为你只是通过3个浮点作为位置可能是相关的;默认值为[0,0,1,0],函数需要四个浮点数(第四个是W坐标,在大多数情况下应该等于1,或者对于无限距离的灯数为0)。

同时仔细检查您提供给glVertexglNormal的数据是否正确。当渲染球体在0,0,0时,每个顶点的法线是这个顶点的标准化位置(显然只适用于球体)。


作为旁注,这段代码显然是过时的,作为免责声明,如果你只是学习,我会抛弃它,转而使用相对现代的东西并使用可编程管道。