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?
Algunas imágenes, o incluso un enlace a un video de Youtube sobre el problema, nos ayudarían a diagnosticar el problema. –