IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

bonne pratique pour déplacer un objet


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut bonne pratique pour déplacer un objet
    Bonjour, je suis en train de traduire mon moteur graphique de sdl à opengl et je voudrais quelques eclaircissement. Ce que j'ai fait c'est que j'ai une structure Texture qui contient l'id de la texture, un vao et l'identifiant d'un des shader programme(car il m'en faut deux différents au cas ou je veux afficher le rectangle et pas la texture). Et quand je veux rendre cette texture à une certaine position, je recrée le vao(qui ne contient que 6 vertexes et 6 textureCoords) pour déplacer la texture et ensuite je fait un use_program avec le bon programme et un draw.
    Mais je me doute que ça ira pas bien loin ainsi car par exemple avec la sdl tout ceci se résumait à changer les coordonnées du rectangle. Donc j'aimerais savoir ce que vous pensais de ma méthode(première fois que j'utilise opengl). Merci d'avance .

    et Vaudrait-il mieux stocker la position de chaque texture dans un vecteur et passer le vecteur en uniforme au shader programme avant chaque draw de texture ?

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    salut attention il faudrait bien comprendre les bases de Open GL.
    OGL manipule des vecteurs qui sont assemblés sous forme de listes de triangles pas des bitmaps.
    C.a.d. que les coordonnées sous OGL ne sont pas des coordonnées de l'écran x et y mais celles d'une matrice de projection
    Citation Envoyé par aperdemak Voir le message
    et Vaudrait-il mieux stocker la position de chaque texture dans un vecteur et passer le vecteur en uniforme au shader programme avant chaque draw de texture ?
    eh bien non il faut définir une entité particulière censée définir un objet c.a.d. que pour un jeu de course de voitures par exemple cet objet pourra désigner une voiture par exemple
    Donc cette entité mettons une classe comprendra un tableau de vecteurs et de textures

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    ok merci, j'ai compris le principe des matrices de projection mais je me demande si c'est plus rapide de créer la matrice de projection à chaque draw ou s'il ne vaut pas mieux changer les 12 vertices qui composent mes vao+recréer les vbo et vao mais seulement quand l'objet bouge. Merci bien.
    et je précise c'est de la 2d

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Salut!
    Ta structure Texture contient trop de concepts différents : image + vertex layout (vao) + shader program.
    Il te faut la découper en plusieurs structures, une par concept.
    Tu verras alors que tu peux l'appeler Sprite .

    La méthode de modifier les sommets du sprite à chaque fois est un choix séduisant, mais le plus mauvais en termes de performance, car il va te falloir renvoyer les sommets au GPU à chaque dessin de sprite, ce qui est une opération lourde.
    Je te conseille donc d'éviter cette solution.

    Les transformations (2D ou 3D) en OpenGL fonctionnent via des matrices de transformation (translate, rotate et scale).
    Pour des sprites, on stockera donc généralement un quad générique pour les sommets : (0, 0), (1, 0), (1, 1), (0, 1), et on mettra le sprite à la bonne taille et à la bonne position via une matrice de transformation.
    C'est la méthode la plus rapide, et la plus flexible, car elle te permet, entre autres, de réutiliser le même quad pour tous les sprites, qui n'auront eux qu'une matrice de transformation différente, pouvant être calculée à partir de la position et de la taille du sprite à chaque fois, ou stockée une fois pour toutes à la construction (si tant est que le sprite ne bouge pas et ne change pas de taille, ce qui n'est pas le cas le plus fréquent).

    Au niveau du code, il va donc falloir ajouter une variable dite "uniforme" à ton shader, qui contiendra cette matrice de transformation.
    Elle est dite "uniforme" car elle est constante pour toutes les unités shader qui vont exécuter ton shader.
    Ce type de variable réside dans une partie spécifique de la mémoire du GPU, qui fait que les transferts vers cette mémoire sont rapides.
    Dans ton code C (ou C++) il te faudra donc gérer cette variable uniforme, pour récupérer son emplacement dans le shader, et la mettre à jour.
    Je te conseille de lire cette traduction que j'avais faite pour le site : https://jeux.developpez.com/tutoriel...les-uniformes/
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    merci pour ces explications très claire je vais donc utiliser une uniforme pour positionner mes sprites et j'utiliserai un seul vao auxquel je binderai les textures à chaque draw de sprite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/09/2010, 14h38
  2. Bonne pratique pour inclure source de projet open source ?
    Par joseph_p dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 05/07/2007, 21h51
  3. Réponses: 5
    Dernier message: 12/09/2006, 18h06
  4. Tutoriel SEO : Introduction et bonnes pratiques pour l'optimisation de pages Web
    Par Community Management dans le forum Référencement
    Réponses: 0
    Dernier message: 06/07/2006, 00h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo