Próbuję zrobić niestandardowy lekki shader i próbowałem wiele różnych rzeczy w czasie. Niektóre z rozwiązań, które znalazłem działają lepiej, inne gorzej. Na to pytanie używam rozwiązania, które do tej pory działało najlepiej.Dlaczego kod oświetlenia GLSL przesuwa punkt świetlny w aparacie?
Mój problem polega na tym, że jeśli przesuniemy "kamerę", pozycje świateł również się poruszają. To rozwiązanie ma bardzo nieznaczny, ale zauważalny ruch, a pozycja światła wydaje się być powyżej tego, gdzie powinno być.
Domyślne oświetlenie OpenGL (bez żadnych modułów cieniujących) działa dobrze (stabilne pozycje światła), ale potrzebuję modułu cieniującego do multiteksturowania i zamierzam użyć jego fragmentów do efektów świetlnych po uruchomieniu.
Vertex Źródło:
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;
}
Fragment Źródło:
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;
}
Co robię źle?
Kilka zdjęć, a nawet link do filmu z Youtube problemu, pomoże nam zdiagnozować problem. –