SDL/OpenGL problème rappel de SDL_SetVideoMode

Timidouveg Messages postés 6 Date d'inscription samedi 26 août 2006 Statut Membre Dernière intervention 28 juin 2008 - 26 déc. 2007 à 00:33
Timidouveg Messages postés 6 Date d'inscription samedi 26 août 2006 Statut Membre Dernière intervention 28 juin 2008 - 26 déc. 2007 à 14:31
Bonjour :)
J'ai rencontré un problème avec OpenGL et SDL, que j'ai réglé en bricolant une sorte de mémoire. Mais, le problème me paraissant abhérant, je ne suis pas sûr d'être passé à côté d'une solution plus simple et moins gourmande.
Voici le problème :
J'ai amorcé OpenGL avec SDL, et je charge mes textures en passant par des SDL_surfaces. Avant tout cela, j'initialise le SDL_SetVideoMode bien comme il faut de cette façon :
ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_OPENGL | SDL_DOUBLEBUF); (j'ai été droit au but ici, car dans mon code tout est fait en orianté objet, donc bien rangé dans un objet Ecran héritant de Image...)
Ensuite j'initialise OpenGL comme il faut aussi, et le programme tourne bien.
Je charge mes textures via des méthodes d'Image et à l'affichage, tout ce passe bien. Quand je fais mes manipulations, aucun problèmes.
Parcontre, dés que je réinitilise SDL_SetVideoMode pour par exemple passer en mode NOFRAME, ou encore retailler ma fenêtre, passer en FULLSCREEN... OpenGL ne suit plus. J'ai compris que les textures étaient effacés de OpenGL. Ainsi, mes polygones étaient blancs, ou si j'avais chargé d'autres textures après la modification de la fenêtre, il se servait de ceux-là.
Savez-vous pourquoi OpenGL perd la mémoire des textures après avoir réutilisé SDL_SetVideoMode ? Y a t-il une option a régler dans OpenGL pour éviter cela, ou est-ce incurable ?

Pour le moment, comme dit au début, j'ai résolu le problème en mémorisant via un Vector<SDL_Surface*> qui pointe sur les SDL_Surface contenu dans mes Images à leur création pour les recharger dans OpenGL après l'appelle de SDL_SetVideoMode. Résultat, OpenGL retrouve la mémoire, mais cela ne risque-t-il pas d'être lent quand il y aura une centaine de textures à recharger ?
L'ennui aussi est que je suis obligé de mémoriser en VRAM  ou en RAM quand plus de place, des SDL_Surfaces contenant la même chose que ce que j'ai donné à OpenGL. Je le fais de toute façon pour des modifs éventuelles, mais tout mes programmes ne necessiteraient pas forcément cela.

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
26 déc. 2007 à 00:49
Ca ressemble à un changement de contexte. En deux mot, SDL fait de la &"&ù$é", et te recrer un nouveau contexte OpenGL, c'est à dire que tout la mémoire vidéo allouée en mode fenetré n'est plus accessible lorsque tu passes en fullscreen. Donc si SDL n'a rien pour gérer ca, t'as plus qu'à faire en sorte qu'on puisse pas changer de mode d'affichage.

"Ca ressemble", ce n'est pas forcément le problème meme si c'est la seule chose qui me vienne en tete.
0
Timidouveg Messages postés 6 Date d'inscription samedi 26 août 2006 Statut Membre Dernière intervention 28 juin 2008
26 déc. 2007 à 01:17
Si c'est ça, est-ce que ça veut dire que le contexte OpenGL précédent existe toujours en mémoire et prendrait de la place ? Car dans ce cas ce serait pire que ce que je pensais O_O
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
26 déc. 2007 à 01:28
J'ai jamais utilisé la SDL, donc je sais pas comment elle fonctionne.

Bon j'ai trouvé ca sur un forum: http://www.developpez.net/forums/archive/index.php/t-199996.html
"j'ai rajouter un appel à ResizeWindow lors du changement de fenêtre
parce que normalement il faut réinitialiser TOUT le contexte OpenGL
lors d'un appel à SDL_SetVideoMode

en fait, tu as rajouté ResizeViewport() après le passage en plein écran pour réinitialiser le contexte OpenGL"

Ca te dit quelque chose la fonction ResizeViewport ?
0
Timidouveg Messages postés 6 Date d'inscription samedi 26 août 2006 Statut Membre Dernière intervention 28 juin 2008
26 déc. 2007 à 14:31
Le ResizeViewport de cette discussion était une méthode écrit par l'auteur du sujet. Dedans, il a mis le glViewport(...), glIdentity()... pour que le cadrage OpenGL soit dimensionné correctement après changement des dimensions de la fenêtre.
Dans mon code, je fais systématiquement, pour le moment car c'est inutile, une mise à jour du glViewport donc quoi qu'il arrive le cadrage suit les changements. Le problème n'affecte que les textures apparement, qui sont bien remis à 0 puisque le contexte OpenGL est réinitialisé.
J'ai d'ailleurs regardé le code de l'auteur de cette discussion et il n'utilisait pas de textures. Je crains qu'il constate le même problème quand il les utilisera
Parcontre, je ne sais pas si ça le fait sous Linux, ne l'ayant pas chez-moi (j'ose pas partitionner mon disque).
Oui désolé, je sais que je suis dans un partie Linux, mais je ne trouvais pas de partie OpenGL sous windows sur le forum, et je voulais être sûr de trouver des personnes utilisant OpenGL et SDL. Est-ce que d'ailleurs ce problème est unique à Windows ? Je me pose la question.
0
Rejoignez-nous