2013-03-31 18 views
0

GLSL寫什麼等於gl_LightSource[0].position.xyz?換句話說,我如何在GLSL中採用vec3(或vec4),並將相同的轉換應用於OpenGL,並將其應用於gl_LightSource[0].position?有我可以使用的mat4嗎?照明不帶gl_LightSource [0]

回答

2

你可以做任何你喜歡的事情。這是着色器的好處。定義一套描述燈光的制服。它的位置可能在你想要的任何空間中,你只需要以某種方式應用正確的轉換。

着色器都是關於自由選擇,你可以做任何你最適合的。固定功能OpenGL在眼睛/視圖空間中進行照明計算,即在模型視圖變換之後。要做到這一點,它會使用模型視圖轉換燈光位置,當您撥打glLightfv(GL_LIGHT…, GL_POSITION, …)時。然後,在繪製幾何體時,在應用了模型視圖變換之後,照明計算將在視圖空間中執行。

+0

當我嘗試在片段着色器中執行此操作時,出現奇怪的照明錯誤。代碼基本上用'(gl_ModelViewMatrix * lightPos).xyz'代替'gl_LightSource [0] .position.xyz',其中lightPos是vec4的燈光位置。但是,當我使用'gl_LightSource [0]'時,燈光看起來不同。 – Abaab

+0

@Abaab:gl_ListSource [0] .position是使用glLightfv(GL_LIGHT ...,GL_POSITION,...)設置的未轉換的燈光位置......它的作用與通用制服完全相同,並未採用特殊處理。無論您使用通用統一格式還是內置狀態變量,都必須在着色器代碼中應用變換。着色器**不是**固定功能,因此必須重新創建任何固定功能處理(因此便利功能,如'ftransform')。用對象的模型視圖矩陣來改變光的位置可能不是正確的。 – datenwolf

+0

@Abaab:總的來說,在使用着色器時,根本不應該使用FFP內置制服。這樣做沒有好處。始終使用通用制服並定義最適合您問題的轉換。在使用着色器時將自己限制爲FFP語義是瘋狂的。 – datenwolf