Dans vertex shaders vous avez gl_Vertex (ou quelque chose d'autre si vous ne l'utilisez pipeline fixe) qui est la position d'un sommet en coordonnées modèle. Multipliez la matrice du modèle par gl_Vertex et vous obtiendrez la position du vertex dans les coordonnées du monde. Affectez-le à une variable variant, puis lisez sa valeur dans fragment shader et vous obtiendrez la position du fragment dans les coordonnées du monde. Maintenant, le problème est que vous n'avez pas nécessairement de matrice de modèle si vous utilisez la matrice modelview par défaut d'OpenGL, qui est une combinaison de matrices de modèle et de vue. Je résous généralement ce problème en ayant deux matrices séparées au lieu d'une matrice modelview:
matrice modèle
- (coordonnées modèle de cartes aux coordonnées monde), et
- matrice de vue (monde cartes vers les coordonnées caméra).
Donc, passez simplement deux matrices différentes à votre vertex shader séparément. Vous pouvez le faire en définissant
uniform mat4 view_matrix;
uniform mat4 model_matrix;
Au début de votre vertex shader. Et puis au lieu de ftransform(), disent:
gl_Position = gl_ProjectionMatrix * view_matrix * model_matrix * gl_Vertex;
Dans le programme principal, vous devez écrire des valeurs à ces deux nouvelles matrices. Tout d'abord, pour obtenir la matrice de vue, effectuez les transformations de la caméra avec glLoadIdentity(), glTranslate(), glRotate() ou gluLookAt() ou ce que vous préférez normalement, puis appelez glGetFloatv (GL_MODELVIEW_MATRIX, & array); afin d'obtenir les données de la matrice à un tableau. Et d'autre part, de manière similaire, pour obtenir la matrice du modèle, appelez aussi glLoadIdentity(); et faites les transformations d'objet avec glTranslate(), glRotate(), glScale() etc. et enfin appelez glGetFloatv (GL_MODELVIEW_MATRIX, & array); Pour extraire les données de la matrice d'OpenGL, vous pouvez l'envoyer à votre vertex shader. Notez en particulier que vous devez appeler glLoadIdentity() avant de commencer à transformer l'objet. Normalement, vous devez d'abord transformer la caméra, puis transformer l'objet, ce qui donne une matrice qui fait à la fois la vue et les fonctions du modèle. Mais parce que vous utilisez des matrices séparées, vous devez réinitialiser la matrice après les transformations de la caméra avec glLoadIdentity(). Gl_FragCoord sont les coordonnées des pixels et non les coordonnées du monde.
Ne pas multiplier par votre gl_ModelViewMatrix. – Hannesh