OpenGL: включение и выключение света

Я пишу программу, где у меня есть маленький «polyman» парень, танцующий в 0,-3, Я покрасил его в белый цвет и теперь пытаюсь запустить диско-подобную сцену, я создал синий и красный свет и пытаюсь чередовать их с помощью счетчика и if а также else заявление. Это все по моему 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, Он работает, но никогда не показывает красный свет, только синий свет. Есть идеи, где я иду не так?

Кроме того, если вам нужно больше увидеть мой код, просто дайте мне знать! 🙂

-2

Решение

Вы включаете свет 0, затем свет 1, и никогда больше не отключаете. Таким образом, начиная со второго кадра, освещение должно быть постоянным. Возможно, разумнее придерживаться и обновлять light 0 или загружать коэффициенты один раз, а затем выполнять включение и отключение в любой условной ветви.

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.

Кроме того, я собираюсь / настоятельно / советую не использовать Fixed-Function-Pipeline для рисования в OpenGL. Для перехода на современный OpenGL существует множество онлайн-учебников.

2

По вопросам рекламы [email protected]