Я работаю с 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();
Почему это? После отключения и повторного включения он перестает работать?