簡體   English   中英

如何停止使用相機移動位置光

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM