首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL灯光更改:环境光更改为漫反射或镜面反射,但不是相反

OpenGL灯光更改:环境光更改为漫反射或镜面反射,但不是相反
EN

Stack Overflow用户
提问于 2012-04-17 04:27:24
回答 2查看 3.5K关注 0票数 0

我在OpenGL的灯光上遇到了麻烦:

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

代码语言:javascript
复制
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;                                                    
}     

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

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

代码语言:javascript
复制
   switch (key) {                              
   case 27:                                    
       exit(1);                                
   case '1':                                   
     option = ambient;                         
     glutPostRedisplay();                      
     break;                                    
   case '2':                                   
     option = diffuse;                         
     glutPostRedisplay();                      
     break;                                    
   case '3':                                   
     option = specular;                        
     glutPostRedisplay();                      
     break;                                    
   }  

知道我的问题是从哪里来的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-17 04:36:40

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

代码语言:javascript
复制
int x;
int y;

更改y不会影响x。如果您有以下switch语句:

代码语言:javascript
复制
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)

  • ambient材质:(0.2, 0.2, 0.2, 1.0)

  • diffuse
  • (1.0, 1.0, 1.0, 1.0) (仅适用于light0。所有其他灯光默认为(0.0 0.0, 0.0, 1.0)
  • diffuse材质:(0.8, 0.8, 0.8, 1.0)
  • specular灯光:(1.0, 1.0, 1.0, 1.0) (仅适用于light0。所有其他灯光默认为(0.0 0.0, 0.0, 1.0)
  • specular材质:(0.0 0.0, 0.0, 1.0)
票数 3
EN

Stack Overflow用户

发布于 2012-04-17 04:40:51

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

代码语言:javascript
复制
glDisable(GL_LIGHT0);

一些帮助:Light source - OPENGL

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10181201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档