我在使用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;
}
知道我的问题来自哪里?
答案 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)