2013-03-06 45 views
2

我在GLSL中寫了一個基本的頂點着色器。以下是源代碼:GLSL點光線變換

varying float intensity; 
uniform vec4 lightPos; 

void main() { 
    intensity = 0.1; 
    vec3 tfVert = (gl_ModelViewMatrix*gl_Vertex).xyz; 
    vec3 tfNorm = normalize(gl_NormalMatrix*gl_Normal).xyz; 
    vec3 tfLightPos = (gl_ModelViewMatrix*lightPos).xyz; 

    vec3 lightDir = normalize(tfLightPos-tfVert).xyz; 
    intensity += dot(lightDir, tfNorm); 

    gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; 
} 

之後,片段着色器以變化強度float的亮度點亮片段。這裏出了什麼問題:我畫幾個立方體,並將OBJ模型加載到這個世界,或者類似的東西。然後我使用glRotatef()和glTranslatef()並再次繪製相同的東西。 燈在兩個不同的位置出現兩次,(有點)。一旦在翻譯的位置,並在原來的位置。翻譯後的模型僅受翻譯位置中的燈光影響,原始模型僅受原始位置中的燈光影響。另外,至關重要的是我不使用gl_LightSource0 []來解決這個問題。有什麼我做錯了嗎?有沒有什麼辦法解決這一問題?我使用glTranslatef()和glRotatef()進行相機定位和旋轉(如果有的話)。

+0

你的'#version'指令在哪裏? – genpfault 2013-03-06 19:04:18

+0

@genpfault'#version 120' – Abaab 2013-03-06 19:36:29

+0

預期的行爲是什麼?一盞燈照亮一切? – genpfault 2013-03-06 20:00:17

回答

0

可悲的是tfLightPos,這是不可能沒有通過更多的修復信息給頂點着色器。由於glTranslatef和glRotatef用於相機移動以及模型移動,因此在沒有將轉換和旋轉傳遞給vec3s中的GLSL的情況下,着色器無法區分這兩者。

1

不要gl_ModelViewMatrix

變換lightPos

只需使用lightPos.xyz到位tfLightPos的 - 其實你dodn't需要在所有

+1

雖然這只是將光線的位置設置在相機的位置。 – Abaab 2013-03-07 02:29:46

+0

換句話說,您的lightPos值是{0,0,0}? – bjorke 2013-03-07 05:06:17

+0

是的,對不起,我應該說:P我正在尋找一種方法來保持燈光在世界空間或任何其他位置{0,0,0}的位置。 – Abaab 2013-03-07 13:56:57