web-dev-qa-db-fra.com

Comment obtenir les matrices de visualisation et de projection dans OpenGL?

J'essaie d'utiliser le langage OpenGL Shading Language (GLSL) version 1.5 pour créer des shaders de vertex et de géométrie.

J'ai appris que dans GLSL version 1.5, les variables intégrées comme gl_ModelViewProjectionMatrix Sont obsolètes, vous devez donc les transmettre manuellement. Si j'ai déjà défini les matrices de vue du modèle et de projection (en utilisant gluLookAt et gluPerspective par exemple), comment puis-je faire passer les matrices dans les vertex et geometry shaders? J'ai fait quelques recherches et certains sites semblent mentionner une fonction glGetMatrix(), mais je ne trouve cette fonction dans aucune documentation officielle, et elle ne semble pas exister dans l'implémentation que j'utilise ( J'obtiens une erreur de compilation unknown identifier: glGetMatrix Lorsque j'essaye de le compiler avec cette fonction).

27
Alex319

Hé, ralentissons un peu ici :) Oui, c'est vrai que vous recevez la matrice par glGetFloatv(GL_MODELVIEW_MATRIX, ptr)... Mais ce n'est certainement pas la chose que vous devriez faire ici!

Laisse-moi expliquer:

Dans GLSL, les variables intégrées comme gl_ModelViewProjectionMatrix Ou les fonctions comme ftransform() sont obsolètes - c'est vrai, mais c'est uniquement parce que la pile de matrice est obsolète dans GL 3.x et vous êtes censé utiliser votre propre pile matricielle (ou utiliser toute autre solution, une pile matricielle est utile mais n'est pas obligatoire!).

Si vous utilisez toujours la pile matricielle, vous comptez sur les fonctionnalités d'OpenGL 2.x ou 1.x. Ce n'est pas grave car tout cela est toujours pris en charge sur les cartes graphiques modernes en raison du profil de compatibilité GL - il est bon de passer à une nouvelle version GL, mais vous peut rester avec cela pour l'instant.

Mais si vous utilisez une ancienne version d'OpenGL (avec pile matricielle), utilisez également une ancienne version de GLSL. Essayez 1.2, car les versions supérieures (y compris votre 1.5) sont conçues pour être compatibles avec OpenGL3, où des éléments tels que les matrices de projection ou de visualisation de modèle n'existent plus dans OpenGL et devraient être passés explicitement en tant que variables uniform personnalisées et définies par l'utilisateur si nécessaire.

La correspondance entre les versions d'OpenGL et de GLSL était un peu délicate (avant de nettoyer la numérotation des versions pour correspondre), mais elle devrait être plus ou moins similaire à:

GL    GLSL

4.1 - 4.1
4.0 - 4.0
3.3 - 3.3
3.2 - 1.5
3.1 - 1.4
3.0 - 1.3
2.x and lower - 1.2 and lower

Donc, pour faire court - les uniformes intégrés du shader sont déconseillés car la fonctionnalité correspondante dans OpenGL est également déconseillée; optez pour une version supérieure d'OpenGL ou une version inférieure de GLSL.

59
Kos

Pour obtenir l'une ou l'autre matrice, vous utilisez les constantes GL_MODELVIEW_MATRIX ou GL_PROJECTION_MATRIX avec glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
10
ergosys
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
1
Andreas Brinck