OpenGL перспектива и освещение не работает? - PullRequest
1 голос
/ 18 августа 2011

РЕДАКТИРОВАТЬ: Несколько человек говорили, что используют glNormal3f () для решения моей проблемы с освещением, но я исследовал и реализовал это только сейчас, и это ничего не изменило.

Я немного новичок в OpenGL, поэтому, полагаю, я делаю что-то не так, но я следовал примерам из Красной книги как можно точнее, и я просто не могу понять, что не так, поэтому я решил, чтопопробуйте спросить вас, ребята.

У меня две проблемы.Во-первых, хотя я уверен, что я правильно использую glFrustum, он по-прежнему визуализирует орфографическую сцену и по какой-то причине визуализирует объекты, которые находятся как перед, так и за камерой.Другая причина в том, что, хотя я почти уверен, что правильно освещаю (потому что следовал примеру в книге), он освещает сцену равномерным цветом, без затенения или чего-то еще.Вот мой код:

#include "GraphicsManager.h"
#include <GL/gl.h>

void GraphicsManager::initialize () {
  fx = 0;
  fy = 0;  
  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT0);
  glDepthFunc (GL_LEQUAL);
  glEnable (GL_DEPTH_TEST);
  glViewport (0, 0, 800, 600);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity ();
  glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity ();
}

int GraphicsManager::draw (std::vector<float> buttoninfo) {
  // changing light_position makes no difference
  GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
  int i, j, k;
  fx += buttoninfo[0];
  fy += buttoninfo[1];
  glClearColor (0.0, 0.0, 0.0, 1.0);
  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3f (0.5, 0.5, 0.8);
  glLoadIdentity ();
  glLightfv (GL_LIGHT0, GL_POSITION, light_position);�
  glRotatef (buttoninfo[3], 1.0, 0.0, 0.0);
  glRotatef (buttoninfo[2], 0.0, 1.0, 0.0);
  glTranslatef (-fx, 0, -fy);
  for (i = 0; i < 5; i ++) {
  for (j = 0; j < 5; j ++) {
  for (k = 0; k < 5; k ++) {
    glPushMatrix ();
    glTranslatef (i, j, k);
    glBegin (GL_TRIANGLE_FAN);
      glVertex3f (0.0, 0.5, 0.0);
      glVertex3f (-0.5, -0.5, -0.5);
      glVertex3f (-0.5, -0.5, 0.5);
      glVertex3f (0.5, -0.5, 0.5);
      glVertex3f (0.5, -0.5, -0.5);
      glVertex3f (-0.5, -0.5, -0.5);
    glEnd ();
    glPopMatrix ();
  }
  }
  }
  glFlush ();
  return (int)buttoninfo[5];
}

Можете ли вы помочь мне выяснить, в чем дело?Заранее спасибо.

1 Ответ

1 голос
/ 18 августа 2011

Вы рисуете элементы вокруг начала координат (0,0,0), но вы не перемещаете «камеру» в начале. так что вы смотрите из исходной точки на сцену, которая находится внутри ваших элементов.

попробуйте если

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glTranslate3f(0, 0, -10); 

работает, чтобы исправить это

и для рендеринга в перспективе рассмотрите возможность использования gluPerspective. http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml

...