我在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;
} 知道我的问题是从哪里来的吗?
发布于 2012-04-17 04:36:40
问题来自于这样一个事实,即状态不会因为您更改了其他状态而消失。如果您有两个全局变量:
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-17 04:40:51
首先,我会使用不同的灯光,而不仅仅是Light0。此外,在打开新的灯之前,尝试关闭所有的灯,方法是:
glDisable(GL_LIGHT0);一些帮助:Light source - OPENGL
https://stackoverflow.com/questions/10181201
复制相似问题