Добавление источника света к трехмерным объектам в OpenGL - PullRequest
0 голосов
/ 03 декабря 2018

Мне было интересно, может ли кто-нибудь помочь мне понять, как добавить источник света к моим 3D-объектам.У меня есть четыре объекта, которые вращаются, и я хочу, чтобы источник света находился в фиксированном положении, и я хочу видеть освещение объекта.

Я пытался сделать это (********):

//*******Initializing the light position
GLfloat pos[] = {-2,4,5,1};

void display() {
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
   glMatrixMode(GL_MODELVIEW);   

   //*******adding the light to the display method
   glLoadIdentity();
   glLightfv(GL_LIGHT0, GL_POSITION, pos);

   // rectangle
   glPushMatrix();
   glTranslatef(0.0f, 2.5f, -8.0f);  
   glRotatef(angleRectangle, 0.0f, 1.0f, 0.0f);  
   drawRectangle();
   glPopMatrix();

   //small cylinder
   glPushMatrix();
   glTranslatef(0.0f, 2.0f, -8.0f);  
   glRotatef(90, 1, 0, 0);
   glRotatef(anglePyramid, 0.0f, 0.0f, 1.0f);
   drawCylinder(0.2, 0.7);
   glPopMatrix();

   //big cylinder
   glPushMatrix();
   glTranslatef(0.0f, 1.5f, -8.0f); 
   glRotatef(90, 1, 0, 0);
   glRotatef(anglePyramid, 0.0f, 0.0f, 1.0f);
   drawCylinder(0.7, 2.7);
   glPopMatrix();

   //pyramid
   glPushMatrix();
   glTranslatef(0.0f, -2.2f, -8.0f);  
   glRotatef(180, 1, 0, 0);
   glRotatef(anglePyramid, 0.0f, 1.0f, 0.0f);  
   drawPyramid();
   glPopMatrix();

   glutSwapBuffers(); 

   anglePyramid += k * 0.2f;  //- is CW, + is CCW
   angleRectangle += -k * 0.2f;

}

//******* Then i added these to the main method
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

Однако, когда я делаю это и запускаю всю программу, мои объекты становятся серыми, а в определенные моменты вращения они становятся белыми.И это не то, что я хочу.Я хочу сохранить свои красочные объекты, но хочу видеть источник света на них.

Любая помощь будет принята с благодарностью.Также дайте мне знать, если вам нужно увидеть больше моего кода, чтобы выяснить проблему.Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Если освещение (GL_LIGHTING) включено, то цвет берется из параметров материала (glMaterial).

Если вы все еще хотитечтобы использовать текущий цвет, необходимо включить GL_COLOR_MATERIAL и установить параметры цветового материала (glColorMaterial):

glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

См. также Базовое освещение OpenGL .


Но обратите внимание, что рисование последовательностями glBegin / glEnd, стеком конвейера с фиксированной функцией и конвейером с фиксированной функцией для каждой модели света вершиныустарел с десятилетий.Прочтите о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер , чтобы узнать о современном способе рендеринга.

...