2011-06-17 14 views
7

Estoy tratando de hacer un sombreador de luz personalizado y estaba probando muchas cosas diferentes con el tiempo. Algunas de las soluciones que encontré funcionan mejor, otras peores. Para esta pregunta, estoy usando la solución que mejor funcionó hasta ahora.¿Por qué el código de iluminación GLSL cambia el punto de luz con la cámara?

Mi problema es que si muevo la "cámara", las posiciones de luz parecen moverse también. Esta solución tiene un movimiento muy leve pero notable y la posición de la luz parece estar por encima de donde debería estar.

La iluminación por defecto de OpenGL (sin sombreadores) funciona bien (posiciones de luz constante) pero necesito el sombreador para la multitextura y estoy planeando usar partes de él para los efectos de iluminación una vez que está funcionando.

Vertex Fuente:

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; 
} 

Fragmento Fuente:

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; 
} 

¿Qué estoy haciendo mal?

+1

Algunas imágenes, o incluso un enlace a un video de Youtube sobre el problema, nos ayudarían a diagnosticar el problema. –

Respuesta

5

No puedo asegurar que ninguno de estos sea el problema, pero podrían causar uno.

En primer lugar, es necesario normalizar su por vértice vn y vlp (Por cierto, trate de usar nombres de las variables más descriptivos. viewLightPosition es mucho más fácil de entender que vlp). Sé que los normalizaste en el sombreador de vértices, pero la interpolación del sombreador de fragmentos los desnormalizará.

En segundo lugar, esto no es particularmente incorrecto tanto como redundante. vec3(gl_LightSource[0].position.xyz). El "position.xyz" ya es un vec3, ya que la máscara swizzle (".xyz") solo tiene 3 componentes. No necesita volver a lanzarlo a un vec3.

+1

Wow. Normalizó las dos variables en el sombreador de fragmentos nuevamente, eliminó la negación para 'gl_Normal' y' gl_Vertex' en el sombreador de vértices y funciona. ¡Muchas gracias! –

Cuestiones relacionadas