На моем Mac не работает базовое освещение OpenGL - PullRequest
1 голос
/ 31 марта 2012

Я работаю с OpenGL в течение нескольких месяцев. Мы начали писать базовые шейдеры в классе, и у нас есть проект Qt + OpenGL. Это просто: интерактивный просмотрщик 3D-сцен. Нам дали стартовый код, который загружает файлы .obj, помещает их в сцену и затем позволяет нам вращаться с помощью мыши.

У меня тут действительно странная проблема, которую мой учитель не смог объяснить. Мы используем GL_LIGHT0 с параметрами по умолчанию:

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0);

Это единственная инициализация. Направление и положение источника света должны быть такими же, как у глаза. И вот как это работает, когда я запускаю программу в Ubuntu; Я загружаю модель чашки, и когда я поворачиваюсь, свет вращается моим глазом, и я вижу, что все его лица освещены. Однако под Mac OS X 10.6.8 он не работает. Свет остается фиксированным, и все лица, которые обращены в другие стороны, являются черными. Я пробовал другие источники света, я пытался загрузить идентификатор в MODELVIEW, а затем сам определял положение и направление, я пытался повторно загрузить код, заново скомпилировать его и запустить, и все та же ошибка.

Программе нужны некоторые файлы .dylib, которые я связываю с помощью программных ссылок (хотя я не думаю, что это проблема). Проблема не в коде, так как он работает в других системах. Возможно ли, что реализация Mac отличается? Как я могу проверить это? Спасибо!

Редактировать: вот большой фрагмент кода:

void GLWidget::initializeGL() {
    glClearColor(0.8f, 0.8f, 1.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0);

    resetCamera();  // sets VRP, OBS...
}

void GLWidget::paintGL( void ) { 
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    setProjection();
    setModelview();

    drawAxes();

    pscene.render();
}

void drawAxes() {
    float L = DRAW_AXES_LENGTH;
    glDisable(GL_LIGHTING);
    glBegin(GL_LINES);
    glColor3f(1,0,0); glVertex3f(0,0,0); glVertex3f(L,0,0); // X
    glColor3f(0,1,0); glVertex3f(0,0,0); glVertex3f(0,L,0); // Y
    glColor3f(0,0,1); glVertex3f(0,0,0); glVertex3f(0,0,L); // Z
    glEnd();
    glEnable(GL_LIGHTING);
}

Это функции, связанные с освещением. Как я уже сказал, LIGHT0 устанавливается один раз внутри initializeGL. Я пытался установить его положение в paintGL, но это тоже не сработало.

----- РЕДАКТИРОВАТЬ 2 ----- Я нашел решение. Внутри drawAxes, перед возвратом, добавьте:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
GLfloat pos[] = {0.0f, 0.0f, 1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glPopMatrix();

Почему это? После отключения и повторного включения он перестает работать?

...