我在OpenGL燈光方面遇到了問題。我的問題是這樣的:當物體旋轉0度時,照明效果很好 - 否則照明會起作用,但會隨物體一起旋轉,而不是固定在場景中。每個型號的本地自動更新openGL燈光
聽起來很簡單吧? OpenGL FAQ對此有一些簡單的建議:傳遞給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();
我以爲法線可能會搞砸了,但是當我使出來,他們看起來很好。還有什麼可能會影響OpenGL照明?常見問題解答中提到:
如果你的光源是 燈具的一部分,你可能還需要 指定造型變換,所以 光位置是在同一位置 的周圍固定幾何形狀。
我認爲這意味着你需要將光線轉換成場景,這是一種不費吹灰之力......但這是否意味着別的什麼?
這真的很奇怪。使用glPushMatrix();當我將燈光位置設置爲0,0,0時,燈光甚至旋轉。 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0,GL_POSITION,Vector4D(0,0,0,1)); glPopMatrix(); – 2010-12-06 19:04:58
我很確定我在渲染對象時做錯了什麼,最後一步是給對象一個局部旋轉,但看起來這個旋轉也適用於光源。我的第一個想法是乘以新的旋轉燈的位置,但我要麼做錯了或它沒有幫助... – 2010-12-07 02:35:35
你怎麼知道燈光在旋轉?嘗試在其位置繪製GL_POINT,並嘗試對glDrawArrays進行註釋(以避免混淆);即使cameraMatrix被固定,點是否移動? – UncleZeiv 2010-12-07 12:16:13