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

Développement 2D, 3D et Jeux Discussion :

[C++] aide Qt OpenGL création minecraft like


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut [C++] aide Qt OpenGL création minecraft like
    bonjour,

    je suis entrain de créer un minecraft-like mais comme je suis débutant j'ai quelques problèmes surtout avec OpenGL avec ce bout de code en ce moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(f.glIsShader(m_vertexID) == GL_TRUE)
            f.glDeleteShader(m_vertexID);
    j'ai besoin de "f" pour utiliser certaines fonctions d'OpenGL (c'est un QGLFunctions)
    m_vertexID est un GLuint qui contient l'ID de mon vertex shader
    j'ai un assert sur la première ligne qui me renvois a ce bout de qglfunctions.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    inline GLboolean QOpenGLFunctions::glIsShader(GLuint shader)
    {
    #ifdef QT_OPENGL_ES_2
        GLboolean result = ::glIsShader(shader);
    #else
        Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
        GLboolean result = d_ptr->IsShader(shader);
    #endif
        Q_OPENGL_FUNCTIONS_DEBUG
        return result;
    }
    sortie de l'application :
    Démarrage de C:\Users\Administrateur\Desktop\programmes\build-OpenGL-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\OpenGL.exe...
    ASSERT: "QOpenGLFunctions::isInitialized(d_ptr)" in file C:\Qt\5.3\mingw482_32\include/QtGui/qopenglfunctions.h, line 1715
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    C:\Users\Administrateur\Desktop\programmes\build-OpenGL-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\OpenGL.exe s'est terminé avec le code 3
    une fenetre visual c++ runtime library s'ouvre avec un message "this application has requested the Runtime to terminate it in an unusual way, please contact..."
    puis une fenetre OpenGL.exe a cessé de fonctionner.
    (oui j'ai appellé mon programme OpenGL pour l'instant)

    j’espère que quelqu'un pourra m'aider
    merci

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 144
    Points : 285
    Points
    285
    Par défaut
    Tu devrais essayer de faire un bloc: try / catch
    et ne pas oublier #include <exception>
    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
     
    try
    {
     if(f.glIsShader(m_vertexID) == GL_TRUE)
            f.glDeleteShader(m_vertexID);
    }
    catch(exception const & e)
    {
        cerr << "Exception dérivée des exceptions standard" << endl;
        cerr << e.what() << endl;
    }
    catch(...)
    {
       cerr << "Autre type d'exception " << endl;
    }
    Si c'est le "Autre type d'exception" qui s'affiche dans la console , alors il faudrat voir si Qt utilise un système d'exception non dérivé de exception
    Edit: peut être mettre ce post dans la catégorie OpenGL ( le mieux serait d'avoir des liens sur plusieurs forum (c++ Qt OpenGL) qui redirige vers un seul "post" , après je sais pas ci c'est possible )

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    juin 2005
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : juin 2005
    Messages : 2 008
    Points : 10 649
    Points
    10 649
    Billets dans le blog
    6
    Par défaut
    Salut !

    Le code de test de l'assertion est assez explicite et devrait t'aider à comprendre ce qui ne va pas.
    La condition QOpenGLFunctions::isInitialized(d_ptr) est fausse, ce qui signifie que tu as du oublier d'appeler une fonction d'initialisation de QOpenGLFunctions. (pour info, j'ai juste tapé QOpenGLFunctions dans Google ...)

    EDIT :
    Pour info, les instructions OpenGL s'effectuent sur un contexte OpenGL actif. Il faut donc d'abord que tu te renseignes sur la manière créer un contexte OpenGL avec Qt, sachant qu'un tel contexte est généralement lié à une fenêtre.
    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).

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    c'est bon j'ai réglé ce problème mais maintenant j'ai des problèmes avec des fonctions visiblement dépréciés (pour les vertex array) mais je pense faire un nouvel objet QOpenGLFunctions_3_0_CoreBackEnd pour pouvoir les utiliser et le try catch ne sert a rien c'est une assertion

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    c'est bon j'ai presque résolu touts les bugs (pour l'instant) il reste plus qu'une erreur : undefined reference to `QOpenGLFunctions_3_0_CoreBackend::QOpenGLFunctions_3_0_CoreBackend(QOpenGLContext*)'
    c'est a dire le constructeur de QOpenGLFunctions_3_0_CoreBackend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cube::Cube(float taille, std::string const vertexShader, std::string const fragmentShader, QOpenGLContext* ctx) : m_shader(vertexShader, fragmentShader, ctx), m_vboID(0), m_tailleVerticesBytes(108 * sizeof(float)), m_tailleCouleursBytes(108 * sizeof(float)), m_vaoID(0), g(ctx)
    c'est g qui est concerné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        QOpenGLFunctions_3_0_CoreBackend g;
    il prend ctx en argument qui est un pointeur sur un QOpenGLContext
    je ne vois pas ce qui peut causer ce bug

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    juin 2005
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : juin 2005
    Messages : 2 008
    Points : 10 649
    Points
    10 649
    Billets dans le blog
    6
    Par défaut
    "Undefined reference" => Erreur de link.
    Es-tu sur d'avoir lié la bibliothèque associée ?
    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).

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    comment linker sur Qt creator ? j'en avais jamais eu besoin je croyais qu c'était automatique

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    et qu'est-ce que je dois linker surtout

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    juin 2005
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : juin 2005
    Messages : 2 008
    Points : 10 649
    Points
    10 649
    Billets dans le blog
    6
    Par défaut
    Je suppose que tu dois linker Qt, mais je n'ai jamais utilisé cette bibliothèque, donc je n'en sais pas plus.
    De même, je n'ai aucune idée de comment faire ça dans QtCreator
    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).

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    mais j'utilise plein d'autres fonctions de Qt et elles marchent parfaitement

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    c'est corrigé mais maintenant j'ai ça en sortie :
    Init SGL4 version:1.08.00.290036
    QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined
    Erreur le fichier Shaders\couleur3D.vert est introuvable
    BPP(32) DB(1N) W(160) H(160) Xclip(0) Yclip(0) PFD(13)
    et je pense que j'aurais un sigsegv sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        f.initializeGLFunctions(&m_contexteOpenGL);
    mais je ne sais pas pourquoi
    voici mon code complet :
    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
    #include "scene.h"
    #include "window.h"
    #include "Shader.h"
    #include <glm/glm.hpp>
    #include <glm/gtx/transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
    #include "scene.h"
    SceneOpenGL::SceneOpenGL(QString titreFenetre, QGLFormat format) : m_titreFenetre(titreFenetre), m_contexteOpenGL(format)
    {
        m_contexteOpenGL.create();
    }
    SceneOpenGL::~SceneOpenGL()
    {
        m_fenetre->close();
    }
    void SceneOpenGL::bouclePrincipale()
    {
        // Variables
     
        bool terminer(false);
        float vertices[] = {-0.5, -0.5, -1.0,   0.0, 0.5, -1.0,   0.5, -0.5, -1.0};
        float couleurs[] = {1.0, 0.0, 0.0,  0.0, 1.0, 0.0,  0.0, 0.0, 1.0};
     
     
        // Shader
        Shader shaderCouleur("Shaders\\couleur3D.vert", "Shaders\\couleur3D.frag", &m_contexteOpenGL);
        shaderCouleur.charger();
        // Matrices
        glm::mat4 projection;
        glm::mat4 modelview;
        projection = glm::perspective(70.0, (double) m_largeurFenetre / m_hauteurFenetre, 1.0, 100.0);
        modelview = glm::mat4(1.0);
     
        // Boucle principale
     
        while(!terminer)
        {
            // Nettoyage de l'écran
            glClear(GL_COLOR_BUFFER_BIT);
            // Réinitialisation de la matrice modelview
            modelview = glm::mat4(1.0);
            // On spécifie quel shader utiliser
            f.glUseProgram(shaderCouleur.getProgramID());
                // On remplie puis on active le tableau Vertex Attrib 0
                f.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
                f.glEnableVertexAttribArray(0);
                // Même chose avec le tableau Vertex Attrib 1
                f.glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, couleurs);
                f.glEnableVertexAttribArray(1);
                // On envoie les matrices au shader
                f.glUniformMatrix4fv(f.glGetUniformLocation(shaderCouleur.getProgramID(), "modelview"), 1, GL_FALSE, glm::value_ptr(modelview));
                f.glUniformMatrix4fv(f.glGetUniformLocation(shaderCouleur.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));
                // On affiche le polygone
                glDrawArrays(GL_TRIANGLES, 0, 3);
                // On désactive les tableaux Vertex Attrib puisque l'on n'en a plus besoin
                f.glDisableVertexAttribArray(1);
                f.glDisableVertexAttribArray(0);
            // On n'utilise plus le shader
            f.glUseProgram(0);
            // Actualisation de la fenêtre
            m_fenetre->updateGL();
        }
    }
    bool SceneOpenGL::initialiserFenetre()
    {
     
        // Création de la fenêtre
     
        QDesktopWidget bureau;
        QGLFormat format;
        format.setDoubleBuffer(true);
        QRect surface_bureau = bureau.screenGeometry();
        int w = surface_bureau.width()/2;
        int h = surface_bureau.height()/2;
        int x = w/2;
        int y = h/2;
        m_contexteOpenGL.makeCurrent();
        m_fenetre = new window(m_titreFenetre, x, y, w, h, &format);
        m_fenetre->setContext(&m_contexteOpenGL);
        m_fenetre->makeCurrent();
        f.initializeGLFunctions(&m_contexteOpenGL);
     
        if(m_fenetre == 0)
        {
            std::cout << "Erreur lors de la creation de la fenetre " << std::endl;
     
            return false;
        }
     
     
        if(m_contexteOpenGL.isValid() == false)
        {
            std::cout << "erreur contexte opengl" << std::endl;
            m_fenetre->close();
            delete m_fenetre;
            return false;
        }
        m_fenetre->swapBuffers();
        return true;
    }

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    je pense que le problème viens surtout des QGLFunctions il n'y a pas un moyen d'utiliser les fonctions d'OpenGL sans cet objet avec glew peut-être?

Discussions similaires

  1. Aide sur la création d'une bdd sous MySQL
    Par Shellai-93 dans le forum Débuter
    Réponses: 20
    Dernier message: 18/08/2006, 12h15
  2. Aide sur la création d'un type simple (nom composite)
    Par testeur dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 06/11/2004, 21h30
  3. [Oracle] Aide pour la création d'un trigger
    Par Sonic dans le forum Administration
    Réponses: 14
    Dernier message: 04/11/2004, 20h54

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