Question

J'essaie de faire un shader léger personnalisé et j'essayais beaucoup de choses différentes au fil du temps. Certaines des solutions que j'ai trouvées fonctionnent mieux, d'autres pires. Pour cette question, j'utilise la solution qui a le mieux fonctionné jusqu'à présent.

Mon problème est que si je déplace la "caméra" autour, les positions lumineuses semblent également se déplacer. Cette solution a un mouvement très léger mais notable et la position de la lumière semble être au-dessus de sa place.

L'éclairage OpenGL par défaut (sans shaders) fonctionne bien (positions de lumière régulière) mais j'ai besoin du shader pour Multitexturing et je prévois d'utiliser des parties de celui-ci pour les effets d'éclairage une fois qu'il fonctionne.

Vertex Source:

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

Source des fragments:

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'est-ce que je fais mal?

Était-ce utile?

La solution

Je ne peux pas être certain que certains d'entre eux sont le problème, mais ils pourraient en provoquer un.

Tout d'abord, vous devez normaliser votre vertex vn et vlp (BTW, essayez d'utiliser des noms de variables plus descriptifs. viewLightPosition est beaucoup plus facile à comprendre que vlp). Je sais que vous les avez normalisés dans le vertex shader, mais l'interpolation du shader de fragment les dénormalisera.

Deuxièmement, ce n'est pas particulièrement mal que redondant. vec3(gl_LightSource[0].position.xyz). Le "position.xyz" est déjà un VEC3, car le masque Swizzle (".xyz") n'a que 3 composants. Vous n'avez plus besoin de le lancer à un VEC3.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top