OpenGL多光源

OpenGL多光源,opengl,lighting,Opengl,Lighting,我正在尝试向场景中添加第二个灯光。我的印象是,我所需要做的就是启用另一个灯光(本例中为LIGHT1),并设置其参数,使其与现有灯光一起工作。记住这一点,这是我的照明初始化: void ThemePark::lightInit(GLfloat sun_position[], GLfloat light1_position[]) { // Enable Lighting glEnable(GL_LIGHTING); glLightModelf(GL_LIGHT_MODEL_

我正在尝试向场景中添加第二个灯光。我的印象是,我所需要做的就是启用另一个灯光(本例中为LIGHT1),并设置其参数,使其与现有灯光一起工作。记住这一点,这是我的照明初始化:

void ThemePark::lightInit(GLfloat sun_position[], GLfloat light1_position[])
{
    // Enable Lighting
    glEnable(GL_LIGHTING);

    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
    glLightfv(GL_LIGHT0, GL_POSITION, sun_position); // Position the lights
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

    // Set light intensity and color for each component
    glLightf(GL_LIGHT0, GL_DIFFUSE, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT0, GL_AMBIENT, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT0, GL_SPECULAR, (1,1,1,1));

    glLightf(GL_LIGHT1, GL_DIFFUSE, (0.7,0.7,0.7,1));
    glLightf(GL_LIGHT1, GL_AMBIENT, (0.3,0.3,0.3,1));
    glLightf(GL_LIGHT1, GL_SPECULAR, (1,1,1,1));

    // Set attenuation
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, -1.0);

    glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.2);

    // Enable Lights
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
}
我还在显示功能中重新定位灯光,如下所示:

if(lighting)
{
    glLightfv(GL_LIGHT0, GL_POSITION, sun_position);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
}
他们的立场是:

GLfloat sun_position[] = {10, 10, -2, 1};
GLfloat light1_position[] = {1, 1, 1, 1};
但是,在执行此操作时,我仍然只有一个活动灯光,LIGHT0。去掉LIGHT0的enable语句会给我一个没有灯光的场景。作为测试,我将lighting initialization函数修改为以下内容,这实际上使LIGHT1与LIGHT0相同,但从未启用或初始化LIGHT0

void ThemePark::lightInit(GLfloat sun_position[], GLfloat light1_position[])
{
    // Enable Lighting
    glEnable(GL_LIGHTING);

    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
    glLightfv(GL_LIGHT1, GL_POSITION, sun_position);

    // Set light intensity and color for each component
    glLightf(GL_LIGHT1, GL_DIFFUSE, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT1, GL_AMBIENT, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT1, GL_SPECULAR, (1,1,1,1));

    // Set attenuation
    glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.5);
    glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, -1.0);

    // Enable Lights
    glEnable(GL_LIGHT1);
}

我也相应地修改了我的显示功能。但是,我仍然看不到场景中的灯光。这里有我遗漏的东西吗?

GL\u LIGHT1-7的默认值实际上与GL\u LIGHT0不同。。。所以你必须找到那些你忘记设置的。也许是二次衰减?如果没有,请尝试将GL_LIGHT1-7的许多默认参数中的所有参数设置为零/关闭状态。

没有回答您的问题,但请注意,固定功能管道已被弃用。这包括gl照明功能。建议您创建自己的照明功能。@Max您是说GLSL类型的功能吗?只是好奇…@Alnitak不赞成吗?我认为主要是在隐式矩阵堆栈、glTranslate、glRotate等上操作的函数。您应该编写采用统一矩阵的顶点着色器。
sun\u position
应该是平行光吗?@Max不,我想知道您的意思是更换固定管道。看来你真的是指GLSL。