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 :

Problème de Skybox avec Qt5 et OpenGL


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Programmeur amateur
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Programmeur amateur
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème de Skybox avec Qt5 et OpenGL
    Bonjour à tous,

    J'ai un problème pour afficher ma skybox, le cube reste désespérement noir... J'utilise Qt 5 avec opengl, je pense que l'erreur se situe lors de la création de la texture Cubemap, mais après avoir consulté tous les exemples que j'ai trouvés je ne comprends pas le problème... Peut-être un truc tout bête.
    Je vous mets mon code de la création de la skybox (initializeGL()) et de son affichage (paintGL()), ainsi que les 2 shaders utilisés.

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    // Création de la Cubemap dans initializeGL()
    void loadTextures()
    {
        ...
     
        QImage posx = QImage("xpos.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
        QImage negx = QImage("xneg.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
        QImage posy = QImage("ypos.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
        QImage negy = QImage("yneg.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
        QImage posz = QImage("zpos.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
        QImage negz = QImage("zneg.png").mirrored().convertToFormat(QImage::Format_RGBA8888);
     
        m_skybox = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
     
        if (!m_skybox->isCreated())
            m_skybox->create()
     
        glBindTexture(GL_TEXTURE_CUBE_MAP, m_skybox->textureId());
     
            m_skybox->setFormat(QOpenGLTexture::RGBAFormat);
            m_skybox->setSize(posx.width(), posx.height(), posx.depth());
            m_skybox->generateMipMaps();
            m_skybox->allocateStorage();
     
     
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)posx.constBits());
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapNegativeX, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)negx.constBits());
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)posy.constBits());
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapNegativeY, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)negy.constBits());
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)posz.constBits());
            m_skybox->setData(0, 0, QOpenGLTexture::CubeMapNegativeZ, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, (const void*)negz.constBits());
     
            m_skybox->setWrapMode(QOpenGLTexture::ClampToEdge);
     
           qDebug() << QString("Nombre de faces de m_skybox: " + QString::number(m_skybox->faces())); // Bizarre, le nombre de faces est 1 et pas 6...
    }
     
    // Affichage dans paintGL()
    void Widget::paintGL()
    {
        // Clear color and depth buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
        // Rendering skybox
        glDisable(GL_DEPTH_TEST);
        glBindTexture(GL_TEXTURE_CUBE_MAP, m_skybox->textureId());
        m_skyboxProg->bind();
     
            QMatrix4x4 mv; // On va envoyer la matrive ModelView mais sans les translations
            mv.lookAt(QVector3D(0, 0, 0), m_target-m_eye, QVector3D(0, 1, 0));
            m_skyboxProg->setUniformValue("mv_matrix", mv);
            m_skyboxProg->setUniformValue("proj_matrix", m_projection);
            m_skyboxProg->setUniformValue("skybox", 0); // 0 pour Texture Unit 0
     
            m_SBvao->bind();
     
                m_skybox->bind(0); // on bind à Texture Unit 0
     
                    glDrawArrays(GL_TRIANGLES, 0, 9*12);
     
                m_skybox->release();
     
            m_SBvao->release();
     
        m_skyboxProg->release();
        glEnable(GL_DEPTH_TEST);
     
    ...
    }
     // Vertex Shader
     
    uniform mat4 mv_matrix; // Même matrice ModelView que celle utilisée pour afficher le reste de la scène, mais qui ne contient pas les translations effectuées pour que la skybox reste centrée sur la caméra
    uniform mat4 proj_matrix;
     
    attribute vec4 a_position;
     
    varying vec3 v_texcoord;
     
     
    void main()
    {
        // La position finale du vertex aura subi les rotations de la caméra mais pas les translations: 
        gl_Position = proj_matrix * mv_matrix * a_position;
     
        // On passe au fragment shader le vertex tel quel 
        v_texcoord = a_position.xyz;
    }
     
    // Fragment Shader
     
    uniform samplerCube skybox;
     
    varying vec3 v_texcoord;
     
     
    void main()
    {
        // Les coordonnées inchangées du vertex (v_texcoord)sont utilisées pour trouver sa couleur dans le cubemap (skybox)
        gl_FragColor = textureCube(skybox, v_texcoord);
    }
    Je précise que les 6 textures utilisées pour les 6 faces ont l'air de se charger correctement.
    Quand j'appelle m_skybox->faces(), au lieu du 6 attendu j'obtiens 1... Voilà pourquoi je pense qu'il y a un problème dans l'initialisation plus que dans l'utilisation de la skybox.

    Voilà, en remerciant d'avance ceux qui vont jeter un oeil!

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Avez vous essayer un débogueur graphique (gDEBugger, glTrace, ...) ?
    J'ose pensé que les textures ne sont pas chargées, mais en lisant à propos du problème de faces, je ne pense pas que ce soit le problème. Du coup, je n'ai pas de piste dans l'immédiat.
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Programmeur amateur
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Programmeur amateur
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour LittleWhite, merci pour votre réponse. Je ne connais pas les débogueurs graphiques, je vais me renseigner.
    En tout cas l'initialisation de la texture Cubemap vous semble correcte?
    Est-il utile d'appeler glEnable(GL_TEXTURE_CUBE_MAP) ou un truc comme ça? (j'ai essayé mais aucun changement)
    Et ai-je bien fait d'utiliser les texture units (comme pour les textures 2D classiques) lors de son utilisation sans le paintGL()?

Discussions similaires

  1. [OpenGL] Problème de contexte avec carte ATI
    Par BigzYeah dans le forum OpenGL
    Réponses: 16
    Dernier message: 13/05/2011, 01h15
  2. Réponses: 4
    Dernier message: 12/03/2011, 18h22
  3. Problème de son avec OpenGL
    Par SQUAL dans le forum Android
    Réponses: 0
    Dernier message: 12/03/2011, 10h51
  4. Problème de normales avec OpenGL
    Par ndech dans le forum OpenGL
    Réponses: 13
    Dernier message: 28/04/2010, 11h53
  5. Problème de profondeur avec OpenGL et GLUT
    Par brotelle dans le forum GLUT
    Réponses: 3
    Dernier message: 12/03/2006, 14h47

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