2011-06-17 22 views
7

我想製作一個自定義淺色着色器,隨着時間的推移嘗試了很多不同的東西。 我發現的一些解決方案效果更好,其他更差。對於這個問題,我使用迄今爲止效果最好的解決方案。爲什麼GLSL照明代碼會使用相機移動光點?

我的問題是,如果我移動「相機」,燈光位置似乎也會移動。這種解決方案有非常輕微但明顯的運動,燈光位置似乎高於應有的位置。

默認OpenGL照明(沒有任何着色器)可以正常工作(穩定的光照位置),但是我需要用於多紋理的着色器,並且我計劃在照明效果工作後使用它的一部分。

頂點來源:

varying vec3 vlp, vn; 

void main(void) 
{ 
    gl_Position = ftransform(); 

    vn = normalize(gl_NormalMatrix * -gl_Normal); 
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex)); 

    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

片段來源:

uniform sampler2D baseTexture; 
uniform sampler2D teamTexture; 
uniform vec4 teamColor; 

varying vec3 vlp, vn; 

void main(void) 
{ 
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0])); 
    newColor = newColor * teamColor; 
    float teamBlend = newColor.a; 

    // mixing the textures and colorizing them. this works, I tested it w/o lighting! 
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend); 

    // apply lighting 
    outColor *= max(dot(vn, vlp), 0.0); 
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a; 

    gl_FragColor = outColor; 
} 

我在做什麼錯?

+1

幾張圖片甚至是一個Youtube視頻的鏈接都可以幫助我們診斷問題。 –

回答

5

我不能確定這些都是問題,但它們可能會導致一個問題。

首先,你需要你的正常化每個頂點vnvlp(順便說一句,儘量使用更具描述性的變量名。viewLightPosition是容易得多比vlp理解)。我知道你在頂點着色器中對它們進行了歸一化處理,但是片段着色器插值會使它們變形。

其次,這不是多餘的錯誤。 vec3(gl_LightSource[0].position.xyz)。 「position.xyz」已經是vec3了,因爲swizzle mask(「.xyz」)只有3個組件。你不需要再把它轉換成vec3。

+1

哇。對片段着色器中的兩個變量再次進行歸一化處理,取出頂點着色器中的「gl_Normal」和「gl_Vertex」的否定結果,並且工作正常。非常感謝! –