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 :

OpenGL ES 2.0, afficher interface 2d sur 3d


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut OpenGL ES 2.0, afficher interface 2d sur 3d
    Salut.

    J'essaye de construire une interface 2d par dessus une vue 3d, mais je n'arrive pas à afficher mes sprites 2d.

    Plutot que lancer de grandes explication, je vais vous mettre un code minimal de mes enchainements OpenGL à chaque Frame. J'aimerais que vous me disiez l'enchainement parait correct. Si ça ne viens pas de cet enchainement, alors ça viens d'ailleurs dans mon code. :p

    Il doit bien y avoir 1 ou 2 truc manquant qui m'empêche d'afficher mes sprite 2d.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    // Je clear ma frame
    			glViewport(0, 0, viewportSize.width, viewportSize.height);
    			glClearColor(0.f, 0.f, 1.f, 1.f);
    			glClear(GL_COLOR_BUFFER_BIT);
    			glClear(GL_DEPTH_BUFFER_BIT);
     
    // Je commence le rendu 3d
    // J'active le test de profondeur
    glEnable(GL_DEPTH_TEST);
     
    // Je draw ma scene 3d
     
    // Je désactive le test de profondeur
    glDisable(GL_DEPTH_TEST);
     
    // Je reset ma matrice de projection + view
    // Sous openGL ES 2.0, il n'y a pas de glProjection ou autre, les matrice sont passée manuellement au shader
    // Donc j'utilise un système fait main qui reproduit le fonctionnement
    Projection::identity(); // Reset la matrice
    Matrix4 view2d; // matrice qui transform la position des objets de coordonnée [0, longueur/largeur] vers des coordonnée [-1; 1]
    Projection::pushMatrix(view2d);
     
    // J'active le blending
    glEnable(GL_BLEND);
    // Je choisi un blending alpha
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
    // Pour chaque sprite
    // J'applique la matrice du sprite
    Projection::pushMatrix(transform);
    // Je bind le shader et la texture, déclare un tableau de vertex, active les bon attributes et fais draw le sprite.
    Projection::popMatrix();
     
    // Je disable le blendMode
    glDisable(GL_BLEND);
     
    // Et je swap les buffer pour afficher la scene
    eglSwapBuffers(...);
    Je ne fais qu'un seul clear du color buffer et depht buffer, il y a peut-être besoin de le faire une nouvelle fois avant de draw la scene 2d? Y a-t-il d'autre fonctions pour gérer le blend?

    N'importe quelle remarque peut m'aider, même un exemple sous OpenGL 1

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Je ne vois pas la ligne pour afficher le sprite
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Par défaut
    Salut !

    Concernant ton enchaînement de commandes GL, lorsque tu commences ton rendus 2D tu désactive le test sur le Z-Buffer mais tu oublis "peut-être" de désactiver l’écriture glDepthMask(false); bon y a peu de chance que cela résout ton problème .

    Tu n’es pas obligé d’appeler plusieurs fois glClear l’énumération des buffers dans GL sont des puissances de 2, donc elles se combinent par un simple ou logique :
    Code OpenGL : Sélectionner tout - Visualiser dans une fenêtre à part
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)

    Sinon d’un point de vue conception, pourquoi utiliser une matrice projection pour le rendu 2D ? Puisque que tu la force à l’identité elle sert donc a rien ! et le changement de repère peut être fixer, directement dans ton propre pipeline de rendu 2D !
    Par exemple pour travailler dans un repère pixel :
    Code GLSL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    attribute vec2 vertex;
    uniform vec2 viewsize; // resolution du frame buffer en pixel
     
    void main(void)
    {
    	gl_Position.xy = ((vertex + 1.0)/2.0) * viewsize;
    }
    Ici je dois indiquer à mon pipeline 2D la résolution de la zone de rendus par l’uniform viewsize, mais pas besoin de lui indiquer à chaque boucle de rendus

    Y a-t-il d'autre fonctions pour gérer le blend?
    Pas d’autre fonction mais peut être par une méthode différente : rendre ta scene 3D dans une texture puis mixer toi-même tes couleurs dans un pixel shader !

    même un exemple sous OpenGL 1
    Rien ne peut t’aider en OpenGL ES 1.0, ce sont des techniques vielles de 10 ans basé sur le pipeline fixe, c’est totalement dépassé … de plus cela ne permet pas de benificier de l’accélération materiel.
    Pourtant le pipeline fixe a toujours la cote sur ce forum, c’est un mystère pour moi ... qui a vécu l’arrivé du pipeline programmable comme une véritable libération ….

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Je ne vois pas la ligne pour afficher le sprite
    J'ai résumé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // Je bind le shader et la texture, déclare un tableau de vertex, active les bon attributes et fais draw le sprite.
    J'ai voulu simplifier car j'ai vérifier, revérifié et trivérifié que c'est ligne ne sont pas fautives.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    GLfloat vertices[20];
    const Dimension2i & textureSize = m_texture->getSize(); // Dimension de l'image, 800 x 600 durant le test
     
    	vertices[0] = 0.f;						vertices[1] = (float)textureSize.height; vertices[2] = 0.f; vertices[3] = 0.f; vertices[4] = 0.f;
    	vertices[5] = 0.f;						vertices[6] = 0.f;						 vertices[7] = 0.f; vertices[8] = 0.f; vertices[9] = 1.f;
    	vertices[10] = (float)textureSize.width;vertices[11] = (float)textureSize.height;vertices[12] = 0.f;vertices[13] = 1.f;vertices[14] = 0.f;
    	vertices[15] = (float)textureSize.width;vertices[16] = 0.f;						 vertices[17] = 0.f;vertices[18] = 1.f;vertices[19] = 1.f;
     
    // Dans mon objet Shader. m_program est le code du programme compilé
    	GLint currentProgram;
    	glGetIntegerv(GL_CURRENT_PROGRAM, &currentProgram);
    	if(currentProgram != m_program)
    	{
    		glUseProgram(m_program);
    	}
     
    // Je bind la texture
    GLint location = glGetUniformLocation(m_program, "uTexture");
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_textureId);
    glUniform1i(location, 0);
     
    // Je set une couleur globale
    GLint location = glGetUniformLocation(m_program, "uColor");
    glUniform4f(location, 1.f, 0.f, 0.f, 1.f);
     
    // Je set la matrice
    GLint location = glGetUniformLocation(m_program, "uModelView");
    glUniformMatrix4fv(location, 1, false, m.pointer()) // m est une matrice 4x4, pointer() retourne un float[16]
     
    // J'active les vertex attrib
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, vertices);
    glEnableVertexAttribArray(0);
     
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, vertices + 3);
    glEnableVertexAttribArray(1);
     
    // Et je draw le tout
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    @Pegase

    En effet je pourrais faire sans matrice avec ton shader, mais je veux pouvoir tourner et redimensionner mes sprites facilement, d'où l'utilisation de matrice.

    J'ai basé mes matrices de projection sur celles de la SFML, mais j'ai aussi essayé de draw le sprite sans aucune projection, en position 0.0. Théoriquement, j'aurai du avoir un quart de l'écran de la couleur de mon sprite, mais je n'ai même pas eu ce résultat...

    J'ai déjà essayé de désactiver le depth mask, et je n'ai pas activé le stencil buffer. :s Je vais tester a nouveau dans ce sens.

    Pour le stencil buffer, est-ce que ça peut avoir un impact sur le dessin 2d? J'ai lus que ça n’influençais que si on voulais avoir un effet de réflection. :/

    D'ailleur, si je touche au glDepthMask, je perd mon affichage 3d, même si je réactive avant de faire le rendu (glDepthMask(GL_TRUE))...

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Je vous conseille gDEBugger pour vérifier le rendu.

    Sinon, j'ai pensé, ne serait-ce pas car le quads est à l'envers. On peut vérifier avec : glCullFace(GL_BACK);/glCullFace(GL_FRONT);
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je vous conseille gDEBugger pour vérifier le rendu.

    Sinon, j'ai pensé, ne serait-ce pas car le quads est à l'envers. On peut vérifier avec : glCullFace(GL_BACK);/glCullFace(GL_FRONT);
    J'ai vérifié le culling au cas où, mais non. Le culling est désactivé en rendu 2d, mais même activé ça ne viens pas de ça. :p ( Ha oui je n'ai pas mis le call au culling sur le code minimal...)

    Je vais essayer gDebugger.

    Edit : gDebugger, c'est juste génial cet outil, mais vu que je connais pas assez bien OpenGL, je sais pas où regarder pour trouver la faute. :/ La succession de call openGL parais correct, mais il y a trop de variable pour que je puisse repérer laquelle ne va pas...

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

Discussions similaires

  1. afficher des courbes sur un seul "axes" d'une interface utilisateur
    Par Angel30 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 06/06/2009, 23h49
  2. Afficher des donnée sur l'interface GUI
    Par norberg dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 29/05/2009, 13h58
  3. Afficher du texte sur l'interface
    Par tayri dans le forum SDL
    Réponses: 4
    Dernier message: 15/05/2008, 17h11
  4. OpenGL - Afficher une image sur un quad
    Par Akwel91 dans le forum OpenGL
    Réponses: 16
    Dernier message: 16/01/2007, 11h04
  5. Réponses: 2
    Dernier message: 26/01/2006, 14h11

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