Les forums de JeuxVideo.com Taille normale Grande taille

Forum : Création de Jeux

Ajouter ce forum à mes forums préférés Ajouter ce forum à mes forums préférés

Sujet : « opengl et 2d  »

Créer un nouveau sujet   Liste des sujets
Alerte mail  Répondre  Rafraichir
  • godrik Voir le profil de godrik
  • Posté le 9 janvier 2012 à 04:08:41 Avertir un administrateur
  • Bonjour a vous tous,

    Aujourd'hui je cherches a porter pour opengl un simple moteur de rendu 2d qui etait ecrit aupart avant avec la lib cairo. La lib cairo m'a bien servi pour prototyper des choses, mais c'est vraiment trop lent pour obtenir un framerate descent.

    J'ai fait de l'opengl, mais il y a pres de 10 ans, et je me rappele plus bien de comment ca marche. On trouve facilement des textes expliquant comment utiliser opengl pour faire de la 3d. Cependant, je cherche principalement a faire de la 2d: rotation zoom, cliping, texture, texte. Je mettrais peut etre un peu de 3d plus tard, mais pour l'instant, c'est la 2d qui m'interesse.

    Avez vous deja utiliser opengl en 2d? Avez vous des references qui me permettrait de me remettre dans le bain d'opengl rapidement?
  • Lien permanent
  • caelacanthe Voir le profil de caelacanthe
  • Posté le 9 janvier 2012 à 08:30:06 Avertir un administrateur
  • SFML se base sur openGL, tu pourrais éventuellement regarder les sources de cette librairie... :(
  • Lien permanent
  • Pilo1488 Voir le profil de Pilo1488
  • Posté le 9 janvier 2012 à 15:04:37 Avertir un administrateur
  • J'ai fait pas mal de trucs en Opengl 2D.
    Y'a pas bien de différence en fait avec la 3D, juste la matrice de projection à utiliser :
    tu fait une ortho avec la taille de l'écran :
    http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

    par exemple glOrtho(0, 640, 0, 480, 0, 1)

    attenntion car en OpenGL y = 0 est en bas (tu peux le passer en haut en inversant et en faisant une translation, ou l'inverse, je me rappel plus mais il suffit de l'écrire et ca viens tout seul).

    Après ben tu dessine des quad (enfin 2 triangles), texturé (ou non meme).
    J'ai jamais trouvé beaucoup de documentation dessus non plus.
    Pour un moteur de jeu "commercial", et pour etre un tantinent optimal, je regroupais les triangles utilisant les memes textures dans un buffer, que je vidais ensuite (en OpenGL glDrawBuffer etc c'est ce qui prends le plus de temps quand tu as très peu de polygone).

    Enfin si tu as des questions plus précise, n'hésite pas :)
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 9 janvier 2012 à 17:53:28 Avertir un administrateur
  • Avec les nouvelles versions de l'API OpenGL, pleins de fonctions sont déclaré "deprecated" c'est à dire obsolètes.

    OpenGL a bien changer en 10 ans, on ne dois plus utiliser (mais c'est toujours possible bien entendu) le pipeline fixe et utiliser des shaders à la place. Et des lib pour gérer les matrices.

    En plus, pour faire de la 2d avec OpenGL, c'est juste de la 3d avec une vue orthogonale, mais tu passera toujours par des polygones/quad pour afficher, car les fonctions "blitter" sont deprecated et aussi extrêmement lentes.

    "attenntion car en OpenGL y = 0 est en bas (tu peux le passer en haut en inversant et en faisant une translation, ou l'inverse, je me rappel plus mais il suffit de l'écrire et ca viens tout seul)."

    Ce n'est pas exact :) tout dépend de comment tu set ta vue. Tout est paramétrable.

    Cordialement.
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 9 janvier 2012 à 17:55:44 Avertir un administrateur
  • MMh, désolé mon ésprit de contradiction prend le dessus parfois (@Pilo1488).

    Sinon, tu peux chercher les tutos de NeHe sur gamedev, qui utilise le pipeline fixe (donc deprecated) mais qui fonctionne toujours très bien.

    Pour un tuto avec l'API au top niveau (pipeline programmable), c'est un peu le bordel, faut s'y faire (et ce retaper tout le calcules des lumières par exemple). Bref, c'est du lourd, pas facile.
  • Lien permanent
  • godrik Voir le profil de godrik
  • Posté le 9 janvier 2012 à 18:23:19 Avertir un administrateur
  • Merci pour vos avis. Je me rappelle du cours de nehe maintenant. C'est avec ca que j'avais commence. Je vois que l'on defini une zone d'affichage a l'ecran avec glviewport. Est ce que l'on peut appeller cette fonctions plusieurs fois pour rendre differement des parties independentes de l'ecran?
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 9 janvier 2012 à 18:28:54 Avertir un administrateur
  • Oui tu peux sans aucun soucis. A chaque fois tu dois remettre la matrice de projection a zéro par contre, si mes souvenirs sont exacts.


  • Lien permanent
  • Pilo1488 Voir le profil de Pilo1488
  • Posté le 9 janvier 2012 à 21:52:52 Avertir un administrateur
  • "Ce n'est pas exact :) tout dépend de comment tu set ta vue. Tout est paramétrable. "
    si si ca c'est exact ;) si x va sur la droite, y va vers le haut. Comme je le disais il faut une transformation pour l'inversé et retomber sur quelque chose de plus commun à la 2D.

    Y'a pas de paramétrage de vue d'ailleurs dans OpenGL? (tu parlais de glViewPort?).

    Concernant ce dernier, on peut l'appeller n'importe quand sans remetre à zero aucune matrice (ca veut dire quoi d'ailleur remetre une matrice à zéro?).

    "OpenGL a bien changer en 10 ans, on ne dois plus utiliser (mais c'est toujours possible bien entendu) le pipeline fixe et utiliser des shaders à la place. Et des lib pour gérer les matrices."
    regarde du coté du directX et viens dire que OpenGL à changé... de plus lib de matrices c'est un peu excessif pour quelques fonctions de bases sur les matrices : multiplication? identité? tu rajoute le calcul de l'inverse, de la transposé... 50/100 lignes en C.

    Faut faire attention avec l'esprit de contradiction!! ;)
  • Lien permanent
  • Lapintade Voir le profil de Lapintade
  • Posté le 9 janvier 2012 à 22:09:15 Avertir un administrateur
  • J'utilise principalement OpenGl car c'est très portable (Win32, Linux et facilement mac Os). Le principe d'OpenGl est très sympa (machine à état) et sa philosophie a été reprise dans les consoles (Ds, Wii par exemple, PSP aussi). De plus OpenGl est utilisé dans les smartphones avec la version SE. Je dirais que le truc a utiliser de nos jours c'est justement OpenGl!

    3D ou 2d, aucune différence. Comme la dit Pilo1488, la seule chose qui change c'est la projection. Pour faire de la 2D, tu utilise une matric ortho et tu mets les bornes que tu veux (la taille de l’écran en pixel, comme ca tu as de la vraie 2D). Dans "Equilibro" (Wii, Win32, Linux, Mac, Amiga Os, IPhone), le jeu était affiché en 3D, mais vu de coté. J'avais une projection 3D et je mettais a distance fixe pour afficher de la 2D (le HUD). C'est très souple.
    http://images.nintendolife.com/news/2009/04/equilibrio_available_on_wiiware_today_in_north_america/attachment/0/large.jpg

    Les viewports ca marche bien aussi. J'avais utilisé cela pour crée les mode multijoueurs (de 2 à 4 joueurs en écran splitté).
    http://media.nintendo.com/nintendo/bin/OahynNrymEL7j1AYN1lj9Sml27FCo6Ci/0JABaB2zXtxGxNIXVeXe_jABHgUksNTj.jpg

    Donc OpenGl, j'adore.
  • Lien permanent
  • Lapintade Voir le profil de Lapintade
  • Posté le 9 janvier 2012 à 22:43:47 Avertir un administrateur
  • j'ai rien uploadé, j'ai cherché sur le net.

    Oui Amiga OS. Ca date de y a trois mois. Les gens qui gèrent cet OS m'ont contacté pour porter certains de mes jeux. J'ai dis oui, car je fut un grand fan d'Amiga dans le passé. Le jeu n'est pas encore sorti je crois, mais le portage est faire depuis 2 mois.
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 9 janvier 2012 à 22:59:23 Avertir un administrateur
  • @pilo1488: on c'est mal compris visiblement quand je faisais allusion à mon esprit de contradiction c'etais pour preciser que ce que tu avais cité étais juste. Bref.

    Concernant DirectX, oui ça a pas mal changé aussi personne n'a dis le contraire.

    Remettre une matrice a zéro c'est une matrice identité, avec des 1 en diagonale quoi...

    Les libs pour les matrices évidement que ce n'est pas obligé, mais c'est pas mal non plus de mettre ça dans des jolies classe, surtout pour manipuler les *,/,+,- et tout facilement avec les possibilité du c++ et des templatess on peux faire de belles choses (et d'autre moins belle certe).

    "Faut faire attention avec l'ésprit de contradiction"
    Oui je sais, parfois on ce prend des gnons, mais j'ai pas peur merci.
  • Lien permanent
  • godrik Voir le profil de godrik
  • Posté le 12 janvier 2012 à 08:11:01 Avertir un administrateur
  • Bonjour a vous,

    J'ai commencer a faire mon affichage avec opengl. C'est plus simple que dans mons souvenir. J'ai des panneaux 2d fonctionnel et la mecanique de mon jeu s'affiche maintenant.

    Il me reste a voir comment mettre des textures et des fonts.

    Merci a vous,
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 12 janvier 2012 à 08:43:49 Avertir un administrateur
  • Salut godrik!

    Pour les textures ça devrais aller. Tu peux te tourner vers une lib comme DevIL qui est super facile à implémenter dans les moteurs et qui charge pas mal d'images. Mais il y en à d'autres, genre gdi32 chui permet de les charger via l'api gdi32 de windows (et ça supporte le chargement de png en plus). Bref un petit googleise et le tour est joué!

    Pour l'affichage de texte, la méthode la plus rapide et efficace que j'ai trouver, c'est la méthode des display list. C'est très bien éxpliqué sur le site de NeHe et c'est de loins la méthode la plus rapide (faudrait voir en passant par des shader, mais ça serait un poil plus complexe). Je me sert de cette methode ici: http://www.pouet.net/prod.php?which=58020

    Tu peux afficher une multitude de caractères avant que la cg commence à broncher. Une astuce supplémentaire c'est de ne pas afficher ' ', pour booster encore plus la display list (non précisé chez NeHe).

    Pour en revenir au shaders, si quelqu'un à déjà écrit du texte en passant part cette méthode je veux bien en discuter car je n'ai pas encore codé cette fonctionnalité dans mes outils.
  • Lien permanent
  • Pilo1488 Voir le profil de Pilo1488
  • Posté le 12 janvier 2012 à 08:57:36 Avertir un administrateur
  • Je crois que godrik est plus un habitué de linux? :)

    Pour les textures tu peux soit utilisé DevIL comme le dit romain, soit utilisé des formats plus adapté pour éviter les conversions au chargement. Par exemple moi j'ai pour habitude d'utiliser le format PVR
    (http://www.imgtec.com/powervr/insider/powervr-pvr
    textool.asp), qui permet de creer des fichier texture dans un format directement exploitable en OpenGL (notament sur iPhone ou tu as des format en 2 et 4bits par pixel). (et du coup le code de chargement est ultra réduit, il suffit de lire les données avec fread, et les uploader avec glTexImage).

    Bref du coup ca permet d'avoir la gestion des texture totalement data driven (puisque le format détermine exactement ce que tu aura en mémoire).

    Pour les charactère, je pense pas que les display list soient la meilleur solution... En général dans les jeux on utilise des version bitmap avec des textures. Y'a plusieurs facon de faire : charger un ttf par exemple dans une texture, ou alors avoir des images "normalisé" (un charactère par bloc de x*y pixels), ou encore des images qui composé d'un arrangement de charactère astucieux pour utilisé au mieux la place dans l'image (et a coté un fichier décrivant les coordonnées et taille de chaque charactère).
    Il y a eu un sujet la dessus sur ce forum, Lapintade avait notament donné le nom d'un logiciel pour faire des textures "optimal" et le fichier de description.

    Si tu veux partir d'un TTF, j'avais trouvé un bout de code fort utile pour ca :
    nothings.org/stb/stb_truetype.h

    Le probleme avec les TTF, c'est que tu ne peux pas facilement rajouté des symboles propre à ton jeux à la place de charactère qui ne sont pas des glyphs.
  • Lien permanent
  • romain337 Voir le profil de romain337
  • Posté le 12 janvier 2012 à 10:08:47 Avertir un administrateur
  • @Pilo1488:

    Quand je parle des display list, c'est bien sûre un système qui utilise des quad et effectivement une texture contenant une représentation graphique des caractères. Et sérieusement, avec l'ancien pipeline, j'ai pas trouvé plus rapide avec OpenGL. Même en passant par un vertex array (mais pas test avec un VBO).

    http://nehe.gamedev.net/tutorial/bitmap_fonts/17002/

    là NeHe génère la texture avec des API propre à windows, mais tu peux utiliser un bitmap ou un png ou un format PVR, qui à l'air sympas d'ailleurs.
  • Lien permanent
  • pilo1488 Voir le profil de pilo1488
  • Posté le 12 janvier 2012 à 10:46:41 Avertir un administrateur
  • En effet romain, j'ai percuté qu'après que c'était aussi des quads :)
    Après tout dépends aussi comment tu compose tes listes ou buffet. Si tu fais une liste ou un buffet par glyph, ça sera lent quoi qu'il arrive (VBO ou pas). L'appel a glDrawBuffer n'est efficace que pour un nombre assez grand de triangle (y'a un benchmark je sais plus ou, qui montre que sur une meme machine, avec un nombre de triangle < 300, entre une geforce2 et une geforce6 il n'y a aucune différence).

    Après avec les buffets, tu peux faire par exemple un buffer qui peut contenir 500 glyphs, le remplir, et l'afficher avec un seul appel. Bon en general le texte c'est rarement le bottleneck (ça dépends des plateforme certes).

    Par contre y'a des trucs assez chiant avec les caractère, je me rappel plus des termes, mais pour faire que VA soit affiche correctement (le V et le A sont "l'un sur l'autre"). A vrai dire j'ai jamais chercher plus loin pour ça.
  • Lien permanent
  • pilo1488 Voir le profil de pilo1488
  • Posté le 12 janvier 2012 à 10:47:25 Avertir un administrateur
  • buffet..... :S désolé je suis sur un mac avec safari et ça me corrige le texte (pas l'habitude)
  • Lien permanent
Alerte mail  Répondre  Rafraichir

Sujet : « opengl et 2d  »

Créer un nouveau sujet   Liste des sujets

Flux RSS du sujet "opengl et 2d "