【问题标题】:Lighting not working on OpenGL - Solid color光照在 OpenGL 上不起作用 - 纯色
【发布时间】:2013-05-11 00:31:32
【问题描述】:

灯光不工作,物体以纯色显示。颜色本身会随着材质或光照参数而变化,但没有阴影或任何东西,只是纯灰色。

下面是部分代码:

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();
}

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

【问题讨论】:

    标签: c++ opengl lighting


    【解决方案1】:

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

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

    如果对象是 3D 的,我认为您只传递 3 个浮点作为位置的事实可能是相关的;默认值为[0,0,1,0],该函数需要四个浮点数(第 4 个是 W 坐标,在大多数情况下应该等于 1,或 0 表示无限远的灯光)。

    还要仔细检查您提供给glVertexglNormal 的数据是否正确。当在 0,0,0 处渲染球体时,每个顶点的法线都是该顶点的归一化位置(显然,仅适用于球体)。


    作为旁注,这段代码显然已经过时了,作为免责声明,如果你只是在学习,我会完全放弃它,并改用相对现代且使用可编程管道的东西。

    【讨论】:

    • 我的意思是整个对象是一种纯色,我知道一个平面阴影球体是什么样子的。
    • 就是这样(w 坐标)。非常感谢你这么快。
    • 唷。我只是想提醒您我的答案得分下的“接受”勾号:) 在 Stack Overflow 上玩得开心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多