OpenGL Light更改:Ambient to Diffuse或Specular可以工作,但不是相反

时间:2012-04-16 20:27:24

标签: opengl light

我在使用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;                                                    
}     

我可以从环境变为漫反射或镜面反射。但是一旦我改变了,我就无法回到环境中,更糟糕的是:回到漫反射,我需要呼唤环境。

我认为这不是来自这段代码:

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

知道我的问题来自哪里?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

首先,我会使用不同的灯而不仅仅是Light0。此外,尝试在使用以下方式关闭所有灯之前关闭所有灯:

glDisable(GL_LIGHT0);

一些帮助:Light source - OPENGL