材料着色不起作用

时间:2013-01-10 09:30:30

标签: c opengl

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

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

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

在main()

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);  

1 个答案:

答案 0 :(得分:3)

你启用了照明吗?只启用一个灯是不够的,你应该启用整个灯光系统(默认情况下它是关闭的)

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

glEnable(GL_LIGHTING);

另外,不要忘记:

glEnable(GL_COLOR_MATERIAL);

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

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

当我第一次使用OpenGL时,我认为这些法线会自动从给定的三角形计算出来。 我错了。 OpenGL不会自动计算模型的法线,尽管从理论上讲,它可以(尽管有块状结果 - 可能更流畅的技术)。

另一个建议 - 避免使用固定管道功能(例如glBegin(...) ... glEnd()块(也称为立即模式))是一个好主意。它已经过时且缓慢。查看this great tutorial series,了解现代游戏中现代技术的一个很好的介绍。