У меня проблемы с освещением OpenGL.Моя проблема заключается в следующем: когда объект имеет нулевое вращение, освещение работает хорошо, иначе освещение работает, но вращается вместе с объектом, а не остается неподвижным относительно сцены.
Звучит просто, верно?В FAQ по OpenGL есть несколько простых советов: координаты, переданные glLightfv (GL_LIGHT0, GL_POSITION ...), умножаются на текущую матрицу MODELVIEW.Так что я, должно быть, звоню не туда ... кроме меня нет.Я скопировал матрицу MODELVIEW в переменную для отладки, и она остается неизменной независимо от того, как вращается мой объект.Так что это должно быть что-то еще, но я в растерянности относительно того, что.
Я рисую модель, используя glDrawArrays, и позиционирую свою модель в мире, используя glMatrixMult, на матрице, построенной из кватерниона вращения и перевода.Все это происходит в glPushMatrix / glPopMatrix, поэтому не должно иметь побочных эффектов на свет.
Урезанная версия моего процесса рендеринга выглядит следующим образом:
//Setup our camera
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
cameraMatrix = translate(Vector3D(Pos.mX,Pos.mY,Pos.mZ)) * camRot.QuatToMatrix();
glMultMatrixf((GLfloat*)&cameraMatrix);
//Position the light now
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat lp[4] = {lightPos.mX, lightPos.mY, lightPos.mZ, 1.0f};
glLightfv(GL_LIGHT0, GL_POSITION,(GLfloat*) lp);
//Loop, doing this for each model: (mRot, mPos, and mi are model member variables)
matrix = translate(Vector3D(mPos.mX,mPos.mY,mPos.mZ)) * mRot.QuatToMatrix();
glPushMatrix();
glMultMatrixf((GLfloat*)&matrix);
glBindBuffer(GL_ARRAY_BUFFER, mi->mVertexBufHandle); //Bind the model VBO.
glDrawArrays(GL_TRIANGLES, 0, mi->verts); //Draw the object
glPopMatrix();
IЯ думал, что нормалы могут быть испорчены, но когда я их выводу, они выглядят хорошо.Есть ли что-нибудь еще, что может повлиять на освещение openGL?В разделе часто задаваемых вопросов упоминается:
Если ваш источник света является частью осветительного прибора, вам также может потребоваться указать моделирующее преобразование, чтобы позиция света находилась в том же месте, что и геометрия окружающего осветителя.
Я понял, что это означает, что вам нужно перевести свет на сцену, что-то вроде легкой задачи ... но означает ли это что-то еще?