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 moderne et matrice de modèle


Sujet :

OpenGL

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut OpenGL moderne et matrice de modèle
    Bonjour,

    je débute un peu dans l'OpenGL moderne, et j'ai pu voir que les fonctions tel que : glTranslated, glRotated, glScaled était notées deprecated, j'essai donc de moderniser mon code, surtout si cela me permet d'augmenter ma vitesse d’exécution.

    J'explique donc mon problème: Je suis en train de totalement refaire une application CAO. J'ai donc des éléments père qui sont clonés à différents endroit. Anciennement, mon prédécesseur utilisai OpenGL version 1.1. voici un exemple de code pour l'affichage d'un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    glPushMatrix( );
    	glTranslated(position.x(), position.y(), position.z());
    	glScaled(facteurZoom, facteurZoom, facteurZoom);
    	glRotated(angle,0.0,0.0,0.0);
     
    	pere.Affiche();
     
    glPopMatrix();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Element::Affiche()
    {
    	glBegin(GL_LINES);
    		glVertex3d (CurrentPoint.y, 0.2, CurrentPoint.x);
    		glVertex3d (previousPoint.x, 0.2, previousPoint.z);
    		glVertex3d (CurrentPoint.y, 0.2, CurrentPoint.x);
    		glVertex3d (nextPoint.x, 0.2, nextPoint.z);
    	glEnd();
    }
    j'ai donc voulu modernisé tout ça en remplaçant l'appelle des fonctions glVertex3d par l'utilisation des VBO, mais du coup je ne sais pas comment appliquer mes transformations géométrique à mes modèles.
    De plus mon programme doit pouvoir afficher un grand nombre d’élément (actuellement avec 200 milles clones de 32 pères différents je stagne à 3fps )

    pourriez vous m'indiquer la façon propre et optimisé de faire?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Heureusement, nous avons deux bonnes séries de tutoriels sur OpenGL moderne, en français, je vous prie. Tout est disponible ici : http://opengl.developpez.com/

    En résumé, la matrice, vous devez la gérer vous même, avec GLM (par exemple). À vrai dire, dans le vieux OpenGL, glTranslate/glRotate, modifiait une matrice, mais c'était implicite. Maintenant, vous devez avoir une matrice pour chaque objet (qui déterminera sa position, sa rotation, son redimensionnement). La matrice devra être envoyé au shader avant le dessin, afin de permettre à la carte graphique d'appliquer la matrice sur l'objet. Je vous conseille maintenant de lire les tutoriels pour que cela soit bien plus simple à comprendre (et bien plus détaillé).
    N'hésitez pas à revenir pour plus de questions
    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 éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Une fois que tu as réussi a implémenter ton renderer 'moderne' avec VBOs et shaders, tu devrais aussi jeter un coup d’œil a l'instancing, ce qui permet de redessiner le même objet plusieurs fois d'affilée pour un coût minime.

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Tout d'abord merci d'avoir pris le temps de me répondre.

    J'ai lu et j'ai enfin réussi a comprendre le principe des shaders (le déclic a été long à la détente).
    Mais je suis bloquer sur quelques choses a ce niveau là. Je m'explique

    Je code mon programme avec Qt sous Qtcreator, voulant profiter de cette bibliothèque , j'ai voulu utilisé les shaders avec les <QGLShaderProgram> mais lorsque mon code passe par la seconde ligne du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_program.addShaderFromSourceFile(QGLShader::Vertex, QString(":/shaders/vertex_shader.glsl"));  
        m_program.addShaderFromSourceFile(QGLShader::Fragment, QString(":/shaders/fragment_shader.glsl"));
    J'obtiens le message suivant :
    Nom : Sans titre.png
Affichages : 147
Taille : 19,2 Ko

    j'ai tenté a titre de test d’inverser les deux ligne mais c'est toujours sur le deuxième appel que cette erreur s'affiche


    Pour info j'utilise QT 64bits et QtCreator avec le compilateur msvc 2012 x64

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Je garde en mémoire pour la suite l'instancing

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Vous utilisez un pointeur NULL. Soit vous utilisez mal les fonctions OpenGL de Qt (mauvaise initialisation), soit vous avez un pointeur NULL dans votre code, simplement. Vous devriez utiliser le débogueur pour vous aider
    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 régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    J'ai completé mon code afin de ressembler le plus possible a celui ci

    Je vous poste ceci ici :
    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
    class GLWidget : public QGLWidget
    {
        Q_OBJECT
     
    protected:
     
        ///---------------------------
        ///attributs
        ///---------------------------
        GLdouble largeur;
        GLdouble hauteur;
     
        //GLdouble pos_souris_X;
        //GLdouble pos_souris_Y;
        QPointF pos_Souris;
     
        QPointF lastPos;
     
        //Couleur
        QColor Background_color;
        QColor Wafer_colorCentre;
        QColor Wafer_colorExterieur;
        QColor Wafer_contour;
        QColor Repere_axeX;
        QColor Repere_axeY;
     
        //propriété du Wafer
        double Wafer_rayon;
        double Wafer_nbDivision;
        double wafer_angle;
        double Wafer_offsetX;
        double Wafer_offsetY;
     
        //DisplayList
        GLuint waferDisplayList;
     
     
        // Camera
        QVector3D PositionCameraInitiale;
        QVector3D CibleCameraInitiale;
        QVector3D PositionCamera;
        QVector3D CibleCamera;
        float zoomSensibility;
        float moveSensibility;
     
        //entré sortie
        int TouchePresse;
     
        //Update de l'affichage
        QTimer m_timer;
        QTime last_time;
        int last_count;
        int frame_count;
        int fps;
     
     
        ListeItem * liste;
     
        //------------------------------
        //      OpengL
        //------------------------------
        QGLShaderProgram m_program;
        ///---------------------------
        ///Methodes
        ///---------------------------
    public:
        GLWidget( const QGLFormat& format, QWidget* parent = 0 );
        void initializeGL();
        bool prepareShaderProgram( const QString& vertexShaderPath, const QString& fragmentShaderPath );
        void resizeGL(int width, int height);
        void paintGL();
        void InitDisplayListWafer();
        void SetListe(ListeItem * p_list){liste = p_list;}
     
     
        // entrée sortie
        void wheelEvent(QWheelEvent* event);
        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void keyPressEvent ( QKeyEvent * event );
        void keyReleaseEvent ( QKeyEvent * event );
     
        //------------------------------
        //methode concernant la caméra
        //------------------------------
        void reinitCam();
        void operateZoom(bool toNear);
     
     
        //----------------------------
        //Methode concernant l'affichage de la position de la souris
        //----------------------------
        QPointF GetPositionSouris(){ return lastPos;}
        int GetFPS(){ return fps;}
     
    };

    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    #include "glwidget.h"
    #include <math.h>
    #include <QDebug>
     
     
    ///////////////////////////////////////////////////////////////////////////
    ////                                 Constructeur
    ///////////////////////////////////////////////////////////////////////////
    //---------------------------------------------------------------------------
    //      Nom     :       GLWidget
    //      Role    :       Constructeur
    //---------------------------------------------------------------------------
    GLWidget::GLWidget(const QGLFormat& format, QWidget* parent ):
        QGLWidget( format, parent ),
        zoomSensibility(1.2f),
        TouchePresse(-1),
        Wafer_offsetX(0.0f),
        Wafer_offsetY(0.0f),
        Wafer_nbDivision(128.0f),/* avec 128, une ligne fantôme se produit, comme si GL_LINE_LOOP possédait
                            une limite et refermait le cycle automatiquement */
     
        wafer_angle(45.0f),
        Wafer_rayon(150.0f),
        waferDisplayList(0),
        PositionCameraInitiale(0.0f, 0.0f, 5.0f),
        CibleCameraInitiale(0.0f, 0.0f, -1.0f),
        liste(NULL)
    {
            lastPos = QPoint(0,0);
            //Background_color.setRgbF(1.0,0.97647,0.917647,1.0);
            Background_color.setRgbF(1.0,0.97647,0.917647,0.0);
            //Background_color =  Qt::GlobalColor::black;
     
           // Wafer_colorCentre.setRgbF(1.00f, 249.0f / 255.0f , 234.0f / 255.0f);
            Wafer_colorCentre.setRgbF(250.0f/ 255.0f, 250.0f / 255.0f ,255.0f / 255.0f);
            //Wafer_colorExterieur.setRgbF(174.0f / 255.0f, 255.0f / 255.0f, 243.0f/ 255.0f);
            Wafer_colorExterieur.setRgbF(239.0f / 255.0f, 239.0f / 255.0f, 239.0f/ 255.0f);
     
            //Wafer_contour.setRgbF(0.0f / 255.0f, 255.0f / 255.0f, 108.0f / 255.0f);
            Wafer_contour.setRgbF(206.0f / 255.0f, 206.0f / 255.0f, 206.0f / 255.0f);
     
            Repere_axeX.setRgbF(0.90f, 0.70f, 0.70f);
            Repere_axeY.setRgbF(0.70f, 0.70f,0.90f);
     
            initializeGL();
            reinitCam();
     
           /* m_timer.setInterval(1000/600);
            QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
            m_timer.start();*/
     
            QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
            m_timer.start(16);
     
            frame_count = 0;
            last_count = 0;
            last_time = QTime::currentTime();
     
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       initializeGL
    //      Role    :       Cette fonction devrait mettre en place tous les drapeaux de rendu de contexte OpenGL, définir les listes d'affichage, etc.
    //---------------------------------------------------------------------------
    void GLWidget::initializeGL()
    {
        QGLFormat glFormat = QGLWidget::format();
        if ( !glFormat.sampleBuffers() )
            qWarning() << "Could not enable sample buffers";
     
        glShadeModel(GL_SMOOTH);
        // changement de la couleur de fond
        glClearColor(Background_color.redF(),Background_color.greenF(), Background_color.blueF(), Background_color.alphaF());
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClearDepth(1.0f);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     
     
        // Prepare a complete shader program...
           if ( !prepareShaderProgram( ":/shaders/vertex_shader.glsl", ":/shaders/fragment_shader.glsl" ) )
               return;
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       prepareShaderProgram
    //      Role    :       Préparation des shaders
    //---------------------------------------------------------------------------
    bool GLWidget::prepareShaderProgram( const QString& vertexShaderPath,
                                         const QString& fragmentShaderPath )
    {
        const GLubyte * test = glGetString(GL_VERSION);
        // First we load and compile the vertex shader...
     
        bool result = m_program.addShaderFromSourceFile( QGLShader::Vertex, vertexShaderPath );
        if ( !result )
            qWarning() << m_program.log();
     
        // ...now the fragment shader...
        result = m_program.addShaderFromSourceFile( QGLShader::Fragment, fragmentShaderPath );
        if ( !result )
            qWarning() << m_program.log();
     
        // ...and finally we link them to resolve any references.
        result = m_program.link();
        if ( !result )
            qWarning() << "Could not link shader program:" << m_program.log();
     
        return result;
    }
     
     
    ///////////////////////////////////////////////////////////////////////////
    ////                                 Gestion de l'affichage
    ///////////////////////////////////////////////////////////////////////////
    //---------------------------------------------------------------------------
    //      Nom     :       resizeGL
    //      Role    :       fonction appellée lors d'un changement de taille du composant.
    //---------------------------------------------------------------------------
    void GLWidget::resizeGL(int width, int height)
    {
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(20.0f, (GLdouble)width/(GLdouble)height, 0.00001, 1000000);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       paintGL
    //      Role    :       fonction appelée à chaque fois que le widget doit être redessiné
    //---------------------------------------------------------------------------
    void GLWidget::paintGL()
    {
        ++frame_count;
        QTime new_time = QTime::currentTime();
        if (last_time.msecsTo(new_time) >= 1000)
        {
            // on sauvegarde le FPS dans last_count et on réinitialise
            last_count = frame_count;
            frame_count = 0;
            last_time = QTime::currentTime();
            fps = last_count;
        }
        //qDebug() << QString("FPS:%1").arg(last_count);
     
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
     
        //	Caméra
        gluLookAt(PositionCamera.x(), PositionCamera.y(), PositionCamera.z(), CibleCamera.x(), CibleCamera.y(), CibleCamera.z(), 0, 1,0);
     
        //	Enregistrement de la matrice de base (transformée pour point de vue)
        //glPushMatrix();
     
        //Affichage du Wafer
        if ( waferDisplayList <=0)
            InitDisplayListWafer();
        if ( waferDisplayList>0)
            glCallList(waferDisplayList);
     
        //glPopMatrix();
     
     
        if ( liste != NULL)
            liste->AfficheItem();
     
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       InitDisplayListWafer
    //      Role    :       fonction d'initialisation de la displayList de la scene ( wafer + repère)
    //---------------------------------------------------------------------------
    void GLWidget::InitDisplayListWafer()
    {
            if (waferDisplayList <=0)
            {
                glDeleteLists(waferDisplayList,1);
                waferDisplayList = 0;
            }
            /* on cree un objet et on recupere son identifiant */
            waferDisplayList = glGenLists(1);
            if(waferDisplayList == 0)
            {
                   qDebug() << "erreur lors de la creation de la liste\n" ;
                   return;
            }
     
            /* remplissage de notre liste */
            glNewList(waferDisplayList, GL_COMPILE); /* start */
                // Affichage du wafer
                glBegin(GL_TRIANGLE_FAN);
                    glColor3f(Wafer_colorCentre.redF(),Wafer_colorCentre.greenF(), Wafer_colorCentre.blueF());
     
                    // point central; la coordonnée y est négative pour ne pas masquer les items
                    glVertex3f(Wafer_offsetX, Wafer_offsetY, -1.1 );
     
                    glColor3f(Wafer_colorExterieur.redF(),Wafer_colorExterieur.greenF(), Wafer_colorExterieur.blueF());
     
                    double parcAngle = 360.0f - wafer_angle;
     
                    for (int i=0; i <= Wafer_nbDivision+1; i++)
                    {
                        double pos = (wafer_angle / 2.0f) + (i % (int) (Wafer_nbDivision+1) * parcAngle / Wafer_nbDivision);
                        double rad_pos = pos * M_PI / 180.0f + M_PI/2;
                        glVertex3f(Wafer_offsetX + cos(rad_pos) * Wafer_rayon, Wafer_offsetY + sin(rad_pos) * Wafer_rayon, -0.9f);
                    }
     
                glEnd();// fin glBegin(GL_TRIANGLE_FAN);
     
     
                // et maintenant le contour
                glLineWidth(1.0);
                glBegin(GL_LINE_STRIP);         // on n'utilise pas GL_LINE_LOOP: bugs à partir de 128 points sur certaines cartes graphiques (dont la mienne!)
                    glColor3f(Wafer_contour.redF(),Wafer_contour.greenF(), Wafer_contour.blueF());
                    for (int i=0; i <= Wafer_nbDivision+1; i++)
                    {
                        double pos = (wafer_angle / 2.0f) + (i % (int) (Wafer_nbDivision+1) * parcAngle / Wafer_nbDivision);
                        double rad_pos = pos * M_PI / 180.0f + M_PI/2;
                        glVertex3f(Wafer_offsetX + cos(rad_pos) * Wafer_rayon, Wafer_offsetY + sin(rad_pos) * Wafer_rayon, -1.1f);
                    }
                glEnd();// fin glBegin(GL_LINE_STRIP);
     
     
                //affichage du repère
                glLineWidth(2);
                glBegin(GL_LINES);
                    glColor3f(Repere_axeX.redF(),Repere_axeX.greenF(), Repere_axeX.blueF());
     
                    glVertex3f(0.0f,0.0f, -0.01f);
                    glVertex3f(1.0f, 0.0f, -0.01f);
     
                    glColor3f(Repere_axeX.redF(),Repere_axeX.greenF(), Repere_axeX.blueF());
                    glVertex3f(0.0f, 0.0f, -0.01f);
                    glVertex3f(0.0f, 1.0f, -0.01f);
                glEnd(); // fin glBegin(GL_LINES);
            glEndList(); // fin de la displayList
    }
     
     
    ////////////////////////////////////////////////////////////////////////////////////
    ////                    Entrée / Sortie
    ////////////////////////////////////////////////////////////////////////////////////
    //---------------------------------------------------------------------------
    //      Nom     :       wheelEvent
    //      Role    :       Action induit par un mouvement de molette
    //---------------------------------------------------------------------------
    void GLWidget::wheelEvent(QWheelEvent* event)
    {
        operateZoom(event->delta() > 0);
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       mousePressEvent
    //      Role    :       Action induit par un clic sur la souris
    //---------------------------------------------------------------------------
    void GLWidget::mousePressEvent(QMouseEvent *event)
    {
        lastPos= event->globalPos();
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       mouseMoveEvent
    //      Role    :       Action induit par un mouvement de la souris
    //---------------------------------------------------------------------------
    void GLWidget::mouseMoveEvent(QMouseEvent *event)
    {
        //if ( TouchePresse == Qt::Key_Control)
        {
            float m_moveSensibility = 63;
            //	Déplacement de la scène parallèlement au plan xy
            QVector3D relativeCam = PositionCamera - CibleCamera;     //  Coordonnées avec la cible comme origine
            //  L'utilisation de relativeCam.length permet d'augmenter l'ampleur du déplacement en dézoom, divisée par m_sensibility pour que cette variation soit aussi assujetie à la sensibilité
            float moveX = (3.0 * relativeCam.length()/m_moveSensibility) * static_cast<float>(event->globalX() - lastPos.x())/m_moveSensibility;
            float moveY = (3.0 * relativeCam.length()/m_moveSensibility) * static_cast<float>(event->globalY() - lastPos.y())/m_moveSensibility;
     
            PositionCamera-= QVector3D(moveX, -moveY,0.0);
            CibleCamera-= QVector3D(moveX, -moveY,0.0);
            //qDebug() << "Camera X : "<<QString::number(PositionCamera.x(),'f') << " ; Camera Y : "<< QString::number(PositionCamera.y(),'f') ;
     
        }
        lastPos= event->globalPos();
    }
    //---------------------------------------------------------------------------
    //      Nom     :       keyPressEvent
    //      Role    :       Action induit par un appuie de touche sur le clavier
    //---------------------------------------------------------------------------
    void GLWidget::keyPressEvent ( QKeyEvent * event )
    {
        TouchePresse = event->key();
        qDebug() << "Appui sur une touche";
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       keyPressEvent
    //      Role    :       Action induit par un relachement de touche sur le clavier
    //---------------------------------------------------------------------------
    void GLWidget::keyReleaseEvent ( QKeyEvent * event )
    {
        TouchePresse = 0;
        qDebug() << "Relachement d'une touche";
    }
     
    ///////////////////////////////////////////////////////////////////////////////
    ////                                 Caméra
    ///////////////////////////////////////////////////////////////////////////
     
    //---------------------------------------------------------------------------
    //      Nom     :       reinitCam
    //      Role    :       Reinitialise la caméra
    //---------------------------------------------------------------------------
    void GLWidget::reinitCam()
    {
        PositionCamera = PositionCameraInitiale;
        CibleCamera = CibleCameraInitiale;
    }
     
    //---------------------------------------------------------------------------
    //      Nom     :       operateZoom
    //      Role    :       Modifi le zoom
    //---------------------------------------------------------------------------
    void GLWidget::operateZoom(bool toNear)
    {
        QVector3D relativeCam = PositionCamera - CibleCamera;
        if(toNear)
            relativeCam /= zoomSensibility;
        else
            relativeCam *= zoomSensibility;
        if(relativeCam.length() < 0.1)
            relativeCam = relativeCam.normalized();
        else if(relativeCam.length() > 999)
            relativeCam = relativeCam.normalized() * 999;
        else
            PositionCamera = relativeCam + CibleCamera;
    }
    et je ne voit pas où je pourrait avoir un pointeur NULL
    ce pourrait 'il que ça soit un mauvais paramétrage du compilateur?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Je pense que vous devriez déplacer l'initialisation dans une fonction à part et ne pas l'appeler dans la construction du widget.
    D'ailleurs, l'exemple de la classe QGLWidget le montre bien. L'initialisation n'est pas appelée durant la construction et j'ose absolument croire qu'il y a une bonne raison
    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.

  9. #9
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    J'ai sorti la fonction InitializeGL() du constructeur mais j'ai toujours la même erreur.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Vous appelez bien la fonction initialise() après la fin du construction du widget ?
    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.

  11. #11
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    oui mon code donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Créer un nouveau document
           GLWidget * zoneCAO = new GLWidget(glFormat);
           zoneCAO->initializeGL();
    c'est bien cela?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Ok
    Vous avez bien enlever l'appel à initialiseGL() du constructeur ?
    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.

  13. #13
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    oui

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pourrions nous avoir une copie du projet pour tester ?
    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.

  15. #15
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Le projet ne compilez pas O_o
    Sinon, vous ne devriez pas inclure "Windows.h", c'est inutile de le faire dans une application Qt.

    Sinon, chez moi, l'application se lance et ne semble pas cracher.
    Est-ce que votre PC est compatible avec OpenGL 3 ? Quelle est la version de Qt que vous utilisez ?
    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.

  17. #17
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Sur mon PC ma carte graphique est en version 4.2 d'openGL.

    concernant QT j'utilise :
    2.8.1 de QtCreator avec une version 5.1.1 de Qt

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pouvez-vous vérifier que vous n'avez pas une technologie de carte graphique hybride, genre, la partie graphique par Intel et une carte graphique dédiée. Dans un tel cas, il se peut que l'application n'utilise pas la bonne carte graphique.
    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.

  19. #19
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Ma carte graphique est une : "Club 3D Radeon™ HD 5450 1 Go Passive"
    je ne sais pas comment savoir si c'est une carte hybride.
    Cependant ma carte mère a également un chipset graphique.
    es ce possible que ça vienne de là?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Oui, j'ai peur que le programme soit lancée avec le chipser intégré à la carte mère et que celui-ci, ne soit pas du tout OpenGL 3. Du coup, le contexte OpenGL n'est pas crée et bam, vous crashez. Cherchez dans l'outil de AMD, voir si vous pouvez forcer l'exécution du programme sur la carte graphique.
    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.

Discussions similaires

  1. Tutoriel OpenGL Moderne : chargement d'un modèle
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 29/04/2014, 07h46
  2. Tutoriel OpenGL Moderne : les matrices
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 30/03/2014, 20h54
  3. Comment vous proposer un tutorial OpenGL moderne?
    Par Narann dans le forum Contribuez
    Réponses: 3
    Dernier message: 09/10/2010, 15h49
  4. Réponses: 0
    Dernier message: 23/01/2009, 13h59

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