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.
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
oui qui a fonctionné! Ça a du sens ... merci mon pote! – Nitrex88