De quoi devrais-je m'inquiéter lorsque je change l'origine d'OpenGL en haut à gauche de l'écran?

11

Pour l'auto-éducation, j'écris un moteur de plateforme 2D en C ++ en utilisant SDL / OpenGL. J'ai d'abord commencé avec SDL pur en utilisant les tutoriels sur sdltutorials.com et lazyfoo.net, mais j'utilise maintenant SDL pour créer un contexte de rendu OpenGL, puis effectuer un rendu avec les fonctions OpenGL (en particulier le mode immédiat mais j'apprends les VAO / VBO) ). J'utilise SDL uniquement pour l'interface, l'audio, etc.

SDL utilise un système de coordonnées dont l'origine est située dans le coin supérieur gauche de l'écran et l'axe positif y pointant vers le bas. Il est facile de configurer ma projection orthographique en OpenGL pour refléter cela.

Je sais que les coordonnées de texture sont un système de droite avec des valeurs de 0 à 1 - le retournement vertical de la texture avant le rendu (enfin, retournez le fichier avant le chargement) donne des textures qui se rendent correctement ... ce qui est bien si je dessine la texture entière, mais finalement j'utiliserai des ensembles de tuiles et je peux imaginer des problèmes.

De quoi devrais-je m'inquiéter en termes de rendu lorsque je fais cela?

Si quelqu'un a des conseils ou s'ils l'ont fait eux-mêmes et peuvent signaler de futurs pièges, ce serait formidable, mais vraiment toutes les pensées seraient appréciées.

dérivé
la source
1
Utilisez-vous SDL pour effectuer le rendu (comme dans les fonctions de fusion de SDL), ou utilisez-vous SDL pour créer un contexte de rendu OpenGL, puis utilisez-vous des fonctions OpenGL pour effectuer le rendu?
Nicol Bolas
1
J'utilise SDL pour créer un contexte de rendu OpenGL et j'utilise des fonctions OpenGL pour le rendu. Je vais clarifier cela dans la question.
dérivé
1
Peut-être que si vous allez utiliser un système physique, mieux voir quel système de coordonnées il utilise (droitier ou gaucher, Y-UP ou Y-DOWN) et continuez à utiliser le même. Bien sûr, vous pouvez faire des choses comme inverser la gravité, mais j'essaierais d'utiliser la même chose pour rendre les choses plus faciles.
Gustavo Maciel

Réponses:

8

"De quoi devrais-je m'inquiéter en termes de rendu lorsque je fais cela?" - pas tant. Un système de coordonnées n'est qu'une convention, pas une règle stricte et rapide, et c'est une chose parfaitement légale et valable à faire. Assurez-vous simplement que vous êtes cohérent dans votre propre utilisation et tout fonctionnera bien.

Maximus Minimus
la source
Génial! J'avais une intuition de soi, c'était la seule chose dont je devais m'inquiéter, mais c'est un nouveau territoire pour moi.
dérivé
1
Je dois ajouter que ce cher vieux Quake l'a fait en 1996 et cela a très bien fonctionné.
Maximus Minimus
5

Lorsque je travaille en 2D avec OpenGL, j'utilise souvent le coin supérieur gauche comme origine. Cela peut être fait avec:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Cependant, il y a quelques pièges lors du changement d'origine en haut à gauche.

Un écueil que j'ai rencontré plus d'une fois:, glScissor()qui est utilisé pour l'écrêtage, utilise toujours les coordonnées en bas à gauche.

Sa signature est:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

x, yspécifiez le coin inférieur gauche de la boîte à ciseaux.

Plus généralement, toutes les fonctions qui fonctionnent en coordonnées de fenêtre utilisent toutes le coin inférieur gauche comme origine. Cela inclut des fonctions comme gluProject, gluUnProject, glCopyPixels, etc.

Mais certaines fonctions comme l' glDrawPixelsutilisation glRasterPospour le positionnement, et glRasterPosutilise des coordonnées d'objet (c'est-à-dire transformées) .

Si vous utilisez Linux et savez comment l'utiliser man, vous voudrez peut-être récupérer une copie des pages de manuel OpenGL ici: ftp://ftp.sgi.com/sgi/opengl/doc/ Je les trouve en temps réel- épargnant.

De plus, je remarque que vous dites "retourner le fichier avant de charger" les textures. Ce n'est pas nécessaire. Au lieu de retourner l'image lors du chargement, il suffit de retourner les coordonnées de la texture pour passer de 1,0 à 0,0 lors du rendu.

QuasarDonkey
la source