繁体   English   中英

OpenGL:打开和关闭灯光

[英]OpenGL: Turning on and off Lights

我正在编写一个程序,其中有一个小“波利曼”家伙在0,-3处跳舞。 我把他涂成白色,现在我试图让一个迪斯科般的场景发生,我创造了一个蓝色和红色的光,并试图通过使用计数器和ifelse语句来交替它们。 这一切都在我的renderscene

float ambientlight[] = {0.0,0.0,1.0,1.0};
float diffuselight[] = {1.0,1.0,1.0,1.0};
float specular[] = {1.0,1.0,1.0,1.0};
float lightpos[] = {0.0,10.0,0.0,1.0};  //light 1
float specref[]={1.0,1.0,1.0,1.0};
float spotdir[]={0.0,-10.0,0.0};

float rectX[6][5], rectY[6][5], rectZ[6][5];

float ambientlight2[] = {1.0,0.0,0.0,1.0};
float diffuselight2[] = {1.0,1.0,1.0,1.0};
float specular2[] = {1.0,1.0,1.0,1.0};
float lightpos2[] = {0.0,10.0,0.0,1.0}; //light 2
float specref2[]={1.0,1.0,1.0,1.0};
float spotdir2[]={0.0,-10.0,0.0};


glColor3f(1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,540,440);
glOrtho(-7.0,7.0,-7.0,7.0,5.0,-5.0);

glEnable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (counterForLights % 2 == 0)   //if counter even
{
    glLightfv(GL_LIGHT0, GL_POSITION,lightpos);
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuselight);
    glLightfv(GL_LIGHT0,GL_SPECULAR, specular);
    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,10.0);  //light 1
    glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,15.0);
    glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotdir);
    glEnable(GL_LIGHT0);
    counterForLights++;
}
else  //if counter odd
    {

        glLightfv(GL_LIGHT1,GL_AMBIENT,ambientlight2);
        glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuselight2);
        glLightfv(GL_LIGHT1,GL_SPECULAR, specular2);
        glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,10.0);
        glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,15.0);  //light2
        glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotdir2);
        glEnable(GL_LIGHT1);
        counterForLights++;
    }

counterForLights是一个等于1的全局变量。 它运行,但从不显示红灯,只显示蓝灯。 关于我在这里哪里出错的任何想法?

另外,如果您需要再查看我的代码,请告诉我! :)

else  //if counter odd
{

    glLightfv(GL_LIGHT1,GL_AMBIENT,ambientlight2);
    glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuselight2);
    glLightfv(GL_LIGHT1,GL_SPECULAR, specular2);
    glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,10.0);
    glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,15.0);  //light2
    glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotdir2);
    glEnable(GL_LIGHT1);
    counterForLights++;
}

您似乎没有为 LIGHT1 指定位置。

另外,我将/强烈/建议不要使用固定功能管道在 OpenGL 中进行绘图。 网上有很多关于过渡到现代 OpenGL 的教程。

您正在启用灯 0,然后启用灯 1,然后再也不禁用。 所以从第二帧开始,光照应该是恒定的。 可能更聪明的是坚持并更新 light 0,或者加载一次系数,然后在任一条件分支中执行启用和禁用。

我正在编写一个程序,其中有一个“ polyman”小伙子在0,-3处跳舞。 我已经将他染成白色,现在正尝试使场景像迪斯科舞厅一样,创造了蓝色和红色的灯光,并试图通过使用计数器以及ifelse语句来替换它们。 这一切都在我的renderscene

float ambientlight[] = {0.0,0.0,1.0,1.0};
float diffuselight[] = {1.0,1.0,1.0,1.0};
float specular[] = {1.0,1.0,1.0,1.0};
float lightpos[] = {0.0,10.0,0.0,1.0};  //light 1
float specref[]={1.0,1.0,1.0,1.0};
float spotdir[]={0.0,-10.0,0.0};

float rectX[6][5], rectY[6][5], rectZ[6][5];

float ambientlight2[] = {1.0,0.0,0.0,1.0};
float diffuselight2[] = {1.0,1.0,1.0,1.0};
float specular2[] = {1.0,1.0,1.0,1.0};
float lightpos2[] = {0.0,10.0,0.0,1.0}; //light 2
float specref2[]={1.0,1.0,1.0,1.0};
float spotdir2[]={0.0,-10.0,0.0};


glColor3f(1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,540,440);
glOrtho(-7.0,7.0,-7.0,7.0,5.0,-5.0);

glEnable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (counterForLights % 2 == 0)   //if counter even
{
    glLightfv(GL_LIGHT0, GL_POSITION,lightpos);
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuselight);
    glLightfv(GL_LIGHT0,GL_SPECULAR, specular);
    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,10.0);  //light 1
    glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,15.0);
    glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotdir);
    glEnable(GL_LIGHT0);
    counterForLights++;
}
else  //if counter odd
    {

        glLightfv(GL_LIGHT1,GL_AMBIENT,ambientlight2);
        glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuselight2);
        glLightfv(GL_LIGHT1,GL_SPECULAR, specular2);
        glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,10.0);
        glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,15.0);  //light2
        glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotdir2);
        glEnable(GL_LIGHT1);
        counterForLights++;
    }

counterForLights是一个等于1的全局变量。 它可以运行,但从不显示红色,仅显示蓝色。 关于我在哪里出问题的任何想法吗?

另外,如果您需要查看我的代码了,请告诉我! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM