2015-11-05 415 views
-1

我在写一个程序,我有一个跳舞在0,-3的小男人。我把他染成了白色,现在我试图让一个迪斯科般的场景变成现实,我创建了一个蓝色和红色的灯光,并试图通过使用计数器和ifelse声明来替代它们。这是在我的rendersceneOpenGL:打开和关闭灯光

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。它运行,但不会显示红灯,只是蓝灯。我要去哪里的任何想法都是错误的?

此外,如果您需要了解我的代码,请告诉我! :)

+1

就像我能说的那样,关于第二盏灯的唯一“红色”是环境部分。由于在典型的材料中,环境系数非常低,所以其影响很小。 – derhass

回答

1

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

+0

Awww我现在看到了,所以理论上我可以使用相同的原理使用计数器,但只有'Light0',然后使用'if计数器是偶数,glLightfv(GL_LIGHT0,GL_AMBIENT ,ambientlight)'然后'else'将会是'glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight2);'? – Bob

+0

是的 - OpenGL是一个很多的全局状态;如果你已经启用了一个灯,那么它将一直保持启用状态,直到你另有说明。但它只是一个编号的插槽。因此,如果更方便,您可以更新该插槽中的信息,而不是在不同的插槽中有不同的数据并在它们之间切换。在OpenGL中的经验法则是,更少的调用是更快的代码,但老实说,如果你使用固定管道,那么我认为它不会有太大的可能性。充其量只会是过早的优化。 – Tommy

2
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中绘图。 There's lots of tutorials online for transitioning to modern OpenGL.

+0

我想要来自相同位置的灯 – Bob

+0

太棒了。你仍然需要明确定义LIGHT1的位置。你只为LIGHT0定义它。 – Xirema

+0

Ohhh我明白了你现在说的 – Bob