Comment obtenez-vous l'modelview et matrices de projection en OpenGL?
Je suis en train d'utiliser l'OpenGL Shading Language (GLSL) de la version 1.5 à faire de vertex et de la géométrie des shaders.
J'ai appris que dans la GLSL la version 1.5, les variables intégrées comme gl_ModelViewProjectionMatrix
sont obsolètes, donc vous devez les passer manuellement. Si j'ai déjà mis la modelview et matrices de projection (à l'aide de gluLookAt
et gluPerspective
par exemple), alors comment puis-je obtenir les matrices de passage dans le vertex et la géométrie des shaders? J'ai fait quelques recherches et certains sites semblent oublier une fonction glGetMatrix()
, mais je ne trouve pas cette fonction dans tous les documents officiels, et il ne semble pas exister dans la mise en œuvre, je suis en utilisant (j'ai une erreur de compilation unknown identifier: glGetMatrix
quand j'essaie de le compiler avec cette fonction).
Vous devez vous connecter pour publier un commentaire.
Hey, il faut ralentir un peu ici 🙂 Oui, c'est vrai que vous recevez de la matrice par
glGetFloatv(GL_MODELVIEW_MATRIX, ptr)
... Mais ce n'est certainement pas la chose à faire ici!Laissez-moi vous expliquer:
En GLSL, des variables intégrées comme
gl_ModelViewProjectionMatrix
ou des fonctions telles queftransform()
sont obsolètes - c'est vrai, mais c'est seulement parce que la ensemble de la matrice de la pile est obsolète dans GL 3.x et que vous êtes supposé utiliser votre propre matrice de la pile (ou utiliser de toute autre solution, une matrice de la pile est utile mais n'est pas obligatoire!).Si vous êtes toujours à l'aide de la matrice de la pile, alors vous êtes en s'appuyant sur les fonctionnalités d'OpenGL 2.x ou 1.x. Ce n'est pas grave puisque tout cela est encore pris en charge sur les cartes graphiques modernes en raison de la GL de compatibilité profil - c'est bon de passer à une nouvelle version d'opengl, mais vous pouvez rester avec cela pour l'instant.
Mais si vous utilisez une ancienne version d'OpenGL (avec matrice de la pile), également utiliser une ancienne version de GLSL. Essayez 1.2, parce que les versions supérieures (y compris votre 1.5) sont conçus pour être compatibles avec OpenGL3, où les choses telles que la projection ou modelview matrices n'existent plus dans OpenGL et devraient être transmis explicitement comme personnalisé, défini par l'utilisateur
uniform
variables si nécessaire.La correspondance entre OpenGL et GLSL versions utilisé pour être un peu délicat (avant qu'ils ont nettoyé le numéro de version de match), mais il devrait être plus ou moins similaires à:
Donc, c'est une longue histoire courte, le shader builtin uniformes sont déconseillés en raison de la fonctionnalité correspondante dans OpenGL est également déconseillé; soit aller pour une plus grande version de OpenGL ou une version inférieure de GLSL.
std::vector<matrix>
et passer le premier objet de la matrice avecglUniformMatrix4fv
. Vous pouvez en avoir plusieurs, et vous êtes en mesure de décider comment les utiliser dans vos shaders.GL_QUADS
, par exemple!)À obtenir soit la matrice que vous utilisez les constantes GL_MODELVIEW_MATRIX ou GL_PROJECTION_MATRIX avec glGetxxxx: