我有一个需要在聚光灯/定向灯下的模型,
意思是,我需要在模式之间切换(聚光灯和方向)。
以下代码有一些解释:
我可以用鼠标移动旋转模型/光源,所以我正在使用
glRotate和glTranslate。
一旦用户按下“L”键,我就应该在模式之间切换。
这是闪电的代码:
void LightBall::projectLight(void)
{
if(LIGHT == _lightMode){
printf("Entering LIGHT mode\n"); <--- Supposed to be a directional light
glDisable(GL_LIGHT1);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, _light_position);
}
if(SPOT_LIGHT == _lightMode){
printf("Entering SPOTLIGHT mode\n"); <--- Supposed to be a spotlight
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_POSITION, _light_position);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,_spotlight_position);
}
}
问题是我在它们之间切换时总是得到相同的灯光模式,
以下是:
在两种灯光模式之间切换并仍然获得相同光线后的另一个例子
源光源旋转(小球):
如何获得想要的结果?
以下是LIGHT0&amp; LIGHT1定义:
GLfloat light_ambient[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
_light_position[0] = 0.0;
_light_position[1] = 1.0;
_light_position[2] = 0.0;
_light_position[3] = 0.0;
_spotlight_position[0] = 0.0;
_spotlight_position[1] = -1.0;
_spotlight_position[2] = 0.0;
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
谢谢!
答案 0 :(得分:9)
GL灯是定向灯还是聚光灯取决于其位置的 w (4th)组件。如果坐标为0,则为方向性。如果非零(通常是1),那就是聚光灯。在调用_lightPosition
之前,您必须相应地修改glLightfv(..., GL_POSITION, ...)
。