[英]How to stop positional light moving with camera
當我在openGL項目中旋轉和/或移動相機時,幾乎就好像有聚光燈在移動,但是我將我的gl燈設置為可定位並賦予其靜態位置。
void Lighting::Display()
{
glPushMatrix();
glTranslatef(0.f, yoffset, 0.f); // move to start
glTranslatef(0.f, ceilHeight * scale[0], 0.f);
DrawLight();
glDisable(GL_LIGHTING);
glPushAttrib(GL_ALL_ATTRIB_BITS);
// Match colour of sphere to diffuse colour of light
glColor4fv(specular);
glTranslatef(0.f, -10.0f * scale[1], 0.f);
glutSolidSphere(5.0f * scale[0], 25, 25);
glPopAttrib();
glPopMatrix();
// Re-enable lighting after light source has been drawn
glEnable(GL_LIGHTING);
// Set properties GL_LIGHT0
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
//glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0001f);
GLfloat pos[4] = { 0.f, 950.f, 0.f, 1.f };
glLightfv(GL_LIGHT0, GL_POSITION, pos);
// enable GL_LIGHT0 with these defined properties
glEnable(GL_LIGHT0);
}
我希望場景的中心懸掛一個單一的光源,該光源從其位置向各個方向均等地發出光,但是似乎有一束光代替聚光燈發出。
這是展示問題的圖像:
如您所見,有一條奇異的光在發出。
當通過glLightfv(GL_LIGHT0, GL_POSITION, pos)
設置光源位置時, pos
將乘以當前模型視圖矩陣。
Blinn-Phong反射模型的環境光( Ia
),擴散光( Id
)和鏡面光( Is
)的強度計算如下:
N ... norlmal vector
L ... light vector (from the vertex position to the light)
V ... view vector (from the vertex position to the eye)
sh ... shininess
H = normalize(V + L)
NdotH = max(dot(N, H), 0.0)
Ia = 1
Id = max(dot(N, L), 0.0)
Is = pow(NdotH, sh)
因此,環境光( GL_AMBIENT
)與任何方向無關。
漫射光( GL_DIFFUSE
)取決於表面的法線向量( N
)和入射光的方向( L
)。 它在照明表面上保持恆定,與視角無關。
鏡面光( GL_SPECULAR
)取決於表面法線向量( N
),光方向( L
)。 以及觀看方向( V
)。 當您在場景中移動時,這會導致鏡面反射高光發生變化,因為到光照表面的觀看方向發生了變化。
還要注意,已棄用的OpenGL固定功能光照模型中的光照計算是針對每個頂點進行的( Gouraud着色 )。 計算出的光將插值在圖元的角之間的區域上。 一個現代的實現是對每個片段進行光照計算( Phong陰影 )。 Gouraud陰影會導致天花板上鏡面高光的斑點外觀,並可能增加意外外觀。 在較小的區域中對區域進行鑲嵌可以改善這一點,但是最好的解決方案是切換到現代 OpenGL中編寫着色器,並根據您的需要實現每個片段的燈光模型。
在設置照明位置之前,請彈出矩陣。 結果,您的燈光位置也始終是您設置的位置。 然后,您將其他所有內容乘以我假設的視圖矩陣。 View矩陣實質上將世界轉化為相機的視圖。 本質上,相機不動,世界圍繞相機移動。 由於光線並未與此視圖矩陣相乘,因此您獲得的光線似乎相對於攝像機保持恆定的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.