我有一个需要在聚光灯/定向光下的模型,

意思是,我需要在两种模式之间切换(聚光灯和定向)。

这是带有一些解释的代码:

我可以通过鼠标移动旋转模型/光源,因此我正在使用

为此进行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);
}
}

问题是在它们之间切换时,我总是得到相同的照明模式,

如下:



另一个例子是在2种照明模式之间切换后仍然获得相同的照明

带有光源旋转的光源(小球):

如何获得想要的结果?

以下是LIGHT0和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);

谢谢!

最佳答案

GL灯是定向灯还是聚光灯取决于其位置的w(第4个)分量。如果坐标为0,则它​​是定向的。如果非零(通常为1),则为聚光灯。在调用_lightPosition之前,您必须相应地修改glLightfv(..., GL_POSITION, ...)

09-27 20:41