Question

J'essaie de mettre en œuvre des feux de point en OpenGL avec GLSL. J'envoie toutes les données nécessaires aux shaders. Par souci de simplicité je n'utilise que la lumière diffuse ici.

Mon exemple montre un énorme triangle que je veux éclairer avec une seule source de lumière. La source de lumière est représentée par un petit triangle bleu.

Pour la lumière diffuse j'ai besoin de connaître l'angle entre la lumière et la surface. Par conséquent, je calcule les Normales et la direction de la lumière. Le point produit alors me donner un nombre compris entre -1 et 1 alors que tout entre 0 et 1 est allumé.

Cependant, je suis ici parce que bloqué cet angle est calculé de manière incorrecte dans mon exemple. Comme il est difficile de shaders de débogage, j'utilisé plusieurs sorties comme la couleur de ma surface. J'ai utilisé la normale comme la couleur du triangle et où la lumière était, la surface était toujours verte. Autrement dit, les Normales pointent vers le haut de l'axe y et donc ils sont calculés à droite. Autrement dit, la direction de la lumière doit être faux. Cependant, je ne peux pas trouver la raison pour laquelle il est faux. La position de la lumière et le sommet » position sont passés dans l'espace mondial du vertex shader, ce qui les transforme ensuite à l'espace des yeux, calcule la direction et passer ce au fragment shader de la lumière:

vertex shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

fragment shader:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

J'ai apposé quelques photos de cet exemple qui montrent sans aucun doute, que l'interpolation est vraiment bizarre. Je sais veux savoir si le code est correct, je collais ou si vous devez en savoir plus du code. D 'autre part, est ce comportement d'interpolation normal ou est-il un bug dans mon code?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

En particulier, la première image montre que le point central de la lumière est PAS directement sous la lumière, mais légèrement déplacé au centre du triangle.

Si je passe « pos » au fragment shader (qui est, il est interpolée), puis calculer « lightDir » dans le fragment shader, tout fonctionne très bien.

Était-ce utile?

La solution

Je pense que votre normalisant lightDir dans le vertex shader affecte le résultat que vous obtenez lorsque interpoler les vecteurs, car il faut la longueur hors de l'équation et affecte donc la « vitesse » de l'interpolation.

Si vous voulez une explication (visuelle), essayez de le dessiner en 2D sur le papier. Tout d'abord tracer une ligne (votre triangle) et un point (source lumineuse). Ajouter deux lignes (lightDir) pour les deux extrémités de la ligne de la source de lumière et ensuite diminuer (normaliser) les lignes de lightDir de sorte qu'ils aient la même longueur et les deux se rencontrent à la source lumineuse. Si vous connectez les deux extrémités des lignes de lightDir normalisées vous obtiendrez une ligne non-parallèle (si la source lumineuse est pas exactement au milieu de votre première ligne). Maintenant, si vous tracez une ligne qui va exactement au milieu de l'une des lignes, vous verrez qu'il ne va pas au milieu de l'autre ligne, mais frappera un peu à gauche ou à droite.

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