2011-07-12 3 views
7

Je développe une application OpenGL 2.1 en utilisant des shaders et j'ai un problème avec mon éclairage par fragment. L'éclairage est correct lorsque ma scène se charge initialement, mais lorsque je parcours la scène, l'éclairage se déplace avec la «caméra» plutôt que de rester dans un endroit statique. Par exemple, si je place ma lumière à droite, le côté droit des objets sera illuminé. Si je déplace ensuite la caméra de l'autre côté de l'objet et que je pointe dans la direction opposée, l'éclairage est toujours sur le côté droit de l'objet (plutôt que d'être sur la gauche, comme il se doit maintenant). Je suppose que je calcule l'éclairage dans le mauvais système de coordonnées, ce qui provoque un mauvais comportement. Je calcul éclairage de la façon suivante ...système de coordonnées d'éclairage par fragment

Dans vertex shader ...

ECPosition = gl_ModelViewMatrix * gl_Vertex; 
WCNormal = gl_NormalMatrix * vertexNormal; 

où vertexNormal est normal dans l'espace objet/modèle.

Dans le fragment shader ...

float lightIntensity = 0.2; //ambient 
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse 

où LightPosition est, par exemple, (100,0, 10,0, 0,0), ce qui mettrait la lumière sur le côté droit du monde tel que décrit ci-dessus. La partie dont je ne suis pas sûr, est la partie gl_NormalMatrix. Je ne suis pas exactement sûr de ce qu'est cette matrice et de l'espace de coordonnées dans lequel elle met mon normal (je suppose l'espace du monde). Si la normale est mise dans l'espace du monde, alors j'ai pensé que le problème était que ECPosition est dans l'espace des yeux alors que LightPosition et WCNormal sont dans l'espace du monde. Quelque chose à ce sujet ne semble pas juste mais je ne peux pas le comprendre. J'ai aussi essayé de mettre ECPosition dans l'espace du monde en le multipliant par ma propre matrice de modèle qui ne contient que les transformations que je fais pour obtenir la coordonnée dans l'espace du monde, mais cela n'a pas fonctionné. Faites-moi savoir si je dois fournir d'autres informations sur mes shaders ou mon code.

Répondre

6

gl_NormalMatrix transforme votre normal en un espace oculaire (voir this tutorial pour plus de détails).

Je pense que pour que votre lumière soit dans une position statique du monde, vous devez transformer votre LightPosition en un espace oculaire aussi bien en le multipliant par votre matrice de vue actuelle.

+0

bon tutoriel sur gl_NormalMatrix. Je comprends cela maintenant. Je vais essayer de transformer ma LightPosition en un espace oculaire et voir ce qui se passe. Bonne suggestion. – Nitrex88

+0

oui qui a fonctionné! Ça a du sens ... merci mon pote! – Nitrex88

Questions connexes