2011-05-04 70 views
1

我對OpenGL有一個非常令人不安的問題。OpenGL燈光出現在對面

我的作業是用人,劍和其他物體創造場景,把點光源放在傢伙的每個「手掌」(綠色在右邊,紅色在左邊),並且有一個定向光來源爲太陽。

這裏是我的程序的兩個版本一個zip:http://www.woofiles.com/dl-245221-OdPUtOaW-Release.zip

(不幸的是,名稱是匈牙利人,「szép_de_rossz_oldalon_a_fény」的意思是「好,但燈是在對面」,和「fény_jó_oldalon_de_ronda」是指「上的燈右側,但醜陋「)。

我的問題是,燈的效果出現在我tesselated參數曲面的另一面。

合乎邏輯的解釋是表面法線不正確,但將其與-1相乘會給出更奇怪的結果。法線向量插值似乎被破壞,剩下的是粗糙的表面,光線不好。所有這一切都通過扭轉法線。 我敢肯定,三角形面向正確的方向,矢量運算是完美無瑕的,並且所有的東西都應該在場景中放置(可以看出劍是綠色的,但是其他表面的那一側是紅色的)。

+0

您是否檢查過着色器以確保它們適合右手座標系?它可能只是一個顛倒z軸的問題。編輯:另外,它聽起來像你正在乘以你的模型視圖矩陣,你可能想看看。 – horatius83 2011-05-04 20:56:47

+0

我不使用自定義着色器,我們必須使用標準管道。我的法線是通過glNormal3f提供給OpenGL的,因此是的,我相信它們是乘以模型視圖矩陣,但不是直接由我。我無法理解的是,如何將法線與-1混淆整個照明? – Vincent 2011-05-04 21:16:44

回答

2

不幸的是你鏈接到沒有足夠的代碼的zip ...

一個一個鏡頭,值得一試,我已經有,當我得到了我的多邊形面層混合之前使用的是使用GL_LIGHT_MODEL_TWO_SIDE作爲glLightModel可以使多邊形的兩面都被點亮而不僅僅是正面。 從內存的使用率是

glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE) 

(或東西LILE說) 進行呼叫任何光線發生之前。

這是一個哈克解決方案,但我不能看到代碼,我想你是在最後期限..一些嘗試,至少直到有人用一個更好的解決辦法:)

+0

不幸的是,沒有工作..:/無論如何,謝謝! – Vincent 2011-05-04 21:17:07

3

聽起來像壞走來法線我 - 記住有很多的方法來搞砸了其他正常的矢量比符號錯誤:

  • 您的法線可能沒有單位長度(你可以通過嘗試glEnable(GL_NORMALIZE),看它是否有差別驗證) 。
  • 它們可能並不是真正正常的表面(通過比較三角形邊緣與法向量的交叉積來檢查)
  • 您可能會對三角形頂點進行不連貫的迴轉(CW/CCW),有效地翻轉正常(除非剔除已啓用 - 那麼你可能根本看不到一些三角形)

祝你好運!

+0

好吧,不知何故GL_NORMALIZE解決了它,但現在我對OpenGL很困惑。我敢肯定,我的法線在將它們乘以-1之前和之後有單位,我的代碼充滿了對此的斷言。現在這很好(順便說一句,他們接受了我對面的燈光),但下一個階段是根據這個場景創建第一人稱擊劍遊戲,所以我真的很想弄清楚真實情況這種現象的原因,至少讓自己冷靜.. GL_NORMALIZE除矢量規範化之外還有別的事嗎? – Vincent 2011-05-05 20:52:06