3

我创建了一个房间,实际上是长方形的,有两扇窗户和一扇门。我一直在尝试用它们的材料特性来照亮这些材料。我使用了下面的代码,但它不起作用;为什么?

注意:正如预期的那样,房间里有灯

在 myinit()

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);


    glLightfv(GL_LIGHT1, GL_AMBIENT, light[0]);  
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light[1]);  
    glLightfv(GL_LIGHT1, GL_SPECULAR,light[2]);
    glLightfv(GL_LIGHT1, GL_POSITION,light[3]);  // position of the light
    glEnable(GL_LIGHT1);                     

在客厅 ()

   glMaterialfv ( GL_FRONT, GL_AMBIENT ,material[0] ) ;
   glMaterialfv ( GL_FRONT, GL_DIFFUSE ,material[1] ) ;
   glMaterialfv ( GL_FRONT, GL_SPECULAR ,material[2] ) ; 
   glBegin (GL_TRIANGLES); 
            glColor3f ( /*...*/ )             
            // ...
   glEnd ( ) ;

在主()

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);  
4

1 回答 1

3

您是否启用了照明本身?仅启用一盏灯是不够的,您还应该启用整个灯光系统(默认情况下它是关闭的)

它应该发生在初始化函数中:

glEnable(GL_LIGHTING);

另外,不要忘记:

glEnable(GL_COLOR_MATERIAL);

如果你想要材料颜色。(您现在拥有它,但它是另一个可能导致问题的小标志)

为了理解 GL 中的光照是如何工作的,另一个必须理解的重要元素是法线。对于几何体中的每个顶点,您还必须告诉 OpenGL 它面向的方向,以便它可以计算其相对于灯光位置的方向,以确定它应该有多亮。看起来像是对 OpenGL 中概念的一个不错的介绍。

当我第一次开始使用 OpenGL 时,我认为这些法线会根据给定的三角形自动计算出来。我错了。 OpenGL 不会自动计算模型的法线,尽管理论上它可以(尽管结果是块状的——使用更先进的技术可能会变得平滑)。

还有另一个建议 - 避免使用固定的管道功能,例如glBegin(...) ... glEnd()块(也称为即时模式)是一个好主意。它已经过时且缓慢。查看这个很棒的教程系列,了解现代游戏中也使用的现代技术。

于 2013-01-10T09:44:29.820 回答