0

我在 OpenGL 中遇到了灯光问题:

我用这段代码改变了我的球灯:

switch(option) {                                            
case ambient:                                               
  glLightfv(GL_LIGHT0,GL_AMBIENT,lum_ambient);              
  glMaterialfv(GL_FRONT,GL_SPECULAR,mat_ambient);           
  break;                                                    
case diffuse:                                               
  glLightfv(GL_LIGHT0,GL_DIFFUSE,lum_diffuse);              
  glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);            
  break;                                                    
case specular:                                              
  glLightfv(GL_LIGHT0,GL_SPECULAR,lum_speculaire);          
  glMaterialfv(GL_FRONT,GL_SPECULAR,mat_speculaire);        
  break;                                                    
}     

我可以从 Ambient 更改为漫反射或镜面反射。但是一旦我改变了,我就不能回到环境,更糟糕的是:要回到漫反射,我需要调用环境。

而且我不认为它来自这段代码:

   switch (key) {                              
   case 27:                                    
       exit(1);                                
   case '1':                                   
     option = ambient;                         
     glutPostRedisplay();                      
     break;                                    
   case '2':                                   
     option = diffuse;                         
     glutPostRedisplay();                      
     break;                                    
   case '3':                                   
     option = specular;                        
     glutPostRedisplay();                      
     break;                                    
   }  

知道我的问题来自哪里吗?

4

2 回答 2

3

问题来自这样一个事实,即状态不会因为您更改了其他状态而消失。如果您有两个全局变量:

int x;
int y;

改变y不影响x。如果你有这个 switch 语句:

switch(option)
{
case ambient:
  x = 4;
  break;
case diffuse:
  y = 6;
  break;
...
}

如果你用 执行这个diffuse,然后用 执行它ambient, 的值是y多少?它仍然是 6。当然是,因为你没有改变它。

OpenGL 中没有“环境”、“漫反射”或“镜面”光照。这些中的每一个都只是每个灯的照明模型中的不同术语。也就是说,OpenGL 总是为每个灯光做所有这些。您看不到镜面反射照明组件的任何效果的原因是初始镜面反射材质颜色为零。这会产生一个零镜面光照分量。

一旦您更改了高光材质颜色,它将保持新值,直到您再次更改它。如果要“关闭”镜面光照,则需要将镜面材质颜色重置为零。其他人也是如此。


您正在尝试在三种照明模型的设置和默认设置之间切换。所以你必须真正做到这一点:你必须将值重置为 OpenGL 默认值。这些可以在 OpenGL 规范中找到。

但是,除了材质颜色之外,您还必须设置光强度。

如果您不想查看规范,这里是默认值:

  • 环境光:(0.0, 0.0, 0.0, 1.0)
  • 环境材料:(0.2, 0.2, 0.2, 1.0)
  • 漫射光:((1.0, 1.0, 1.0, 1.0)仅适用于light0。所有其他灯光默认为(0.0 0.0, 0.0, 1.0)
  • 漫反射材质:(0.8, 0.8, 0.8, 1.0)
  • 镜面光:((1.0, 1.0, 1.0, 1.0)仅适用于 light0。所有其他灯光默认为 (0.0 0.0, 0.0, 1.0)
  • 镜面材质:(0.0 0.0, 0.0, 1.0)
于 2012-04-16T20:36:40.497 回答
0

首先,我会使用不同的灯光,而不仅仅是 Light0。另外,在打开新灯之前尝试关闭所有灯:

glDisable(GL_LIGHT0);

一些帮助:光源 - OPENGL

于 2012-04-16T20:40:50.617 回答