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 background arrière-plan fixe


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut OpenGL background arrière-plan fixe
    Bonsoir,

    Après quelques heures passées à essayer d'afficher une image en arrière-plan fixe dans une fenêtre OpenGl, je viens demander votre aide.

    Après une lecture des techniques de Skybox, de FBO, de quad avec texture, mes essais ne m'ont pas mené à bout.

    J'obtiens une texture incomplète et qui s'affiche trop grand.

    La texutre à une résolution de 1384*893 (je n'ai pas le choix), et l'affichage se fait dans la même résolution.

    Voici, ce que j'ai déjà fait... je n'y vois plus rien, merci de bien vouloir y jeter un oeil :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    void GLWidget::initializeGL()
    {
     
     
        if (m_displayStyle)
            m_displayStyle->initGL(); 
     
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mBackgroundGL.width(), mBackgroundGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, static_cast<GLubyte*>(mBackgroundGL.bits()));
     
    }
     
     
    void GLWidget::paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     
       // draw background
       glEnable(GL_TEXTURE_2D);
       glMatrixMode(GL_PROJECTION);
       glPushMatrix();
       glOrtho(0, 1, 0, 1, 0, 1);
       glMatrixMode(GL_MODELVIEW);
       glPushMatrix();
       glLoadIdentity();
       glDisable(GL_DEPTH_TEST);
       glBindTexture(GL_TEXTURE_2D, texture);
       glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 0.0f); glVertex2f( 0.0f, 0.0f);
    		glTexCoord2f(0.0f, 1.0f); glVertex2f( 0.0f, 1.0f);
    		glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f, 1.0f);
    		glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0f, 0.0f);
        glEnd();
     
        glEnable(GL_DEPTH_TEST);
        glPopMatrix();
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
     
       /*glRasterPos2i (-50, 0);
       glDrawPixels (mBackgroundGL.width(), mBackgroundGL.height(), GL_RGBA,
                     GL_UNSIGNED_BYTE,
                     static_cast<GLubyte*>(mBackgroundGL.bits()));
        glEnable(GL_DEPTH_TEST);*/
     
        //QPainter p(this);
     
        //p.drawImage(0,0,mBackground);
     
        //p.end();
     
        if (m_displayStyle)
            m_displayStyle->draw();
     
    }
     
    void GLWidget::resizeGL(int width, int height)
    {
        int side = qMin(width, height);
        glViewport(0, 0, width, height);
        //glViewport(0, 0, 1384, 893);
        //mBackground = mBackground.scaled(QSize(width, height));
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
        glMatrixMode(GL_MODELVIEW);
    }
    P.S : j'aime utiliser QT, mais j'ai l'impression que mon problème se situe chez openGL dans les transformations.

    Merci encore,

    G

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    dans ta boucle de dessin, tu appelles:

    glOrtho(0, 1, 0, 1, 0, 1);
    alors que dans ta boucle de redimensionnement tu as

    glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
    déjà là, ca ne colle pas. Si tu veux utiliser des coordonnées de 0 à 1 comme tu le fais avec ton quad, c le 1er glOrtho qu'il faut utiliser. Mais là encore, PAS dans la boucle d'affichage. glOrtho n'a besoin d'être appelé que lorsque l'on redimensionne.

    Enleve-le celui du dessin et remplace celui de resizeGL avec.

    sinon je ne suis pas sûr que tes Push/PopMatrix sur la matrice de projection servent à grand chose. Il me semble que ca ne s'utilise qu'avec la matrice de modelisation normalement.

    Sinon, par rapport 'à la taille de ta texture: peut-importe les dimensions, tout ce qui compte c de définir un cadrage avec glOrtho puis de dessiner un quad dont les coins correspondent aux limites de ce cadrage. En fonction de la taille de ta texture elle sera etirée ou réduite. Donc tu n'es pas forcé d'avoir un affichage en 1384*893.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    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 157
    Billets dans le blog
    152
    Par défaut
    Juste une autre remarque,
    C'est que normalement il faut avoir des tailles de textures qui sont des puissances de 2.

    En fait cela dépend du matériel, certaines cartes gèrent bien la chose, d'autre moins.
    Pour pouvoir faire une texture ayant une taille en puissance de 2, il ne nécessite pas forcément le redimensionnement de celle ci avec GIMP ou autre, par contre, dans le programme il te faudra faire un glyScaleImage pour faire le redimensionnement. Normalement cela affecte peu la qualité.
    Et avec cette méthode, l'image de base est toujours la même.
    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.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Merci !

    Je me suis débrouillé.
    Je posterais le code modifié, d'ici quelques jours.

    Merci de votre réactivités et de vos conseils !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Pardon pour le retard et ceux qui ont pu chercher... Voici le code utilisé pour mon système :

    Pour l'initialisation :
    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
     
    void GLManager::initBackground()
    {
        // Load background image
        mBackground = QImage("Texture/fond_1920_1080.gif");
     
        // Convert background image to GL format
        mBackgroundGL = GLManager::convertToGLFormat(mBackground);
     
        // Create an openGL texture
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mBackgroundGL.width(), mBackgroundGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, static_cast<GLubyte*>(mBackgroundGL.bits()));
    }
    Le draw :

    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
    void GLManager::drawBackground()
    {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt( 0.0f, 0.0f, 1.0f,    // Eye-position
                   0.0f, 0.0f, 0.0f,    // View-point
                   0.0f, 1.0f, 0.0f );  // Up-vector
        glEnable(GL_TEXTURE_2D);
        glDisable(GL_DEPTH_TEST);
        glBindTexture(GL_TEXTURE_2D, texture);
     
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex2f( -1.0f, -1.0f);
            glTexCoord2f(0.0f, 1.0f); glVertex2f( -1.0f, 1.0f);
            glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f, 1.0f);
            glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0f, -1.0f);
        glEnd();
     
        glEnable(GL_DEPTH_TEST);
    }
    ET voilà ! Encore merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/06/2013, 08h55
  2. Réponses: 1
    Dernier message: 05/10/2008, 22h51
  3. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  4. comment stoper 1 thread d'arrière-plan
    Par ms91fr dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2003, 17h46
  5. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54

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