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

Discussion :

QGLShader

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut QGLShader
    Bonjour a tous,
    J’espère être dans la bonne rubrique, si non, vous me direz .
    Je me lance dans la programmation shader et j'avoue être un peu dépassé, mais bon, faut bien commencer un jour
    Alors je programme avec Qt creator sur un Windows 32bit. Dans un premier temps j'essayais de configurer de façon la plus standard les libs de glew, mais impossible (enfin si, ça doit être possible, mais j'ai pas trouvé la solution) de lier correctement ces libs (j'ai toujours eu des messages du type "undefined reference to `_imp___glblablabla`").
    Donc après avoir bien galéré, j'ai remarquais les classes de Qt: QGLShader et QGLShaderProgram.Je me suis donc dit pourquoi pas les utiliser car en plus, pour les libs, Qt les gérera tout seul . Alors j'ai lu bcp de choses a droite a gauche et j'ai réussi a faire un code qui compile a priori sans erreur. Quoique si, puisque ça ne fonctionne pas .
    J'essaie donc de faire juste un premier affichage qui fonctionne simple bete et mechant pour voir comment ça marche. Pouvez vous me dire ou je me suis trompé dans le code suivant?

    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
    #include "windowopengl.h"
     
    WindowOpengl::WindowOpengl(QWidget *parent)
        : QGLWidget(parent)
    {
        setMinimumWidth(200);
     
        minRange = 1.0;
        maxRange = 120.0;
     
        distCam = 80.0;
     
        Delta = 0.0;
     
        //program = new QGLShaderProgram;
    }
     
     
    WindowOpengl::~WindowOpengl()
    {
    }
     
    void WindowOpengl::initializeGL()
    {
        program = new QGLShaderProgram();
     
        glClearColor(0.1,0.1,0.0,1);
     
        if (!program->addShaderFromSourceCode(QGLShader::Vertex,
        "attribute highp vec4 vertex;"
        "attribute mediump mat4 matrix;"
        "void main(void)"
        "{"
        " gl_Position = matrix * vertex;"
        "}"))
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
     
        if (!program->addShaderFromSourceCode(QGLShader::Fragment,
        "uniform mediump vec4 color;"
        "void main(void)"
        "{"
        " gl_FragColor = color;"
        "}"))
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
        if (!program->link())
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
    }
     
    void WindowOpengl::resizeGL(int width, int height)
    {
        int side = qMin(width, height);
        glViewport((width - side) / 2, (height - side) / 2, side, side);
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
     
        gluPerspective( 45.0, 1, 0.1, 60.0 );
     
        glMatrixMode(GL_MODELVIEW);
    }
     
    void WindowOpengl::paintGL()// draw the scene:
    {
        glClear(GL_COLOR_BUFFER_BIT );
        if (!program->bind())
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
     
        QVector3D triangleVertices[] = {
        QVector3D(1.0f, 1.0f, -5.0f),
        QVector3D(0.0f, 1.0f, -5.0f),
        QVector3D(1.0f, 0.0f, -5.0f)
        };
     
        int vertexLocation = program->attributeLocation("vertex");
        int colorLocation = program->attributeLocation("color");
        int matrixLocation = program->attributeLocation("matrix");
     
        QMatrix4x4 pmvMatrix;
     
        program->enableAttributeArray(vertexLocation);
        program->setAttributeArray(vertexLocation, triangleVertices);
        program->setUniformValue(matrixLocation, pmvMatrix);
        program->setUniformValue(colorLocation, QVector4D(0.5, 0, 0, 1));
     
        glDrawArrays(GL_TRIANGLES, 0, 3);
     
        program->disableAttributeArray(vertexLocation);
        program->release();
    }
    Pour les courageux (ou les fanatiques ) qui ont lu tout ça, merci de votre temps et peut être votre aide. C U

    PS: les "QMessageBox::information"s ne sont que temporaire pour voir si des erreurs sont survenu, aucun ne se sont affiché (pas d'erreur?). si une erreur survient dans le paintGL, une boucle sans fin se produira car au moment de valider le messagebox, le paintGL sera rappele et rebelote -> erreur, enfin bref vous m'avez compris
    Eagl.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut
    Re,
    Pour les gens a qui ca interesse, j'ai reussi a faire mon premier affichage ... en bidouillant, . Ce qui me laisse a supposer qu'il me reste ENOOORMEMENT a comprendre pour faire des shaders . Ce que je ne comprend pas, c'est pourquoi ce premier exemple ne fonctionnait pas, c'etait qd meme l'exemple du site de la doc.
    Bon allez, pour les curieux, je balance le code qui est presque similaire au precedant, et qui fonctionne chez moi, du moins ca a l'air de fonctionner.

    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
     
    #include "windowopengl.h"
     
    WindowOpengl::WindowOpengl(QWidget *parent)
        : QGLWidget(parent)
    {
        setMinimumWidth(500);
     
        //program = new QGLShaderProgram;
    }
     
     
    WindowOpengl::~WindowOpengl()
    {
    }
     
    void WindowOpengl::initializeGL()
    {
        program = new QGLShaderProgram();
     
        glClearColor(0.f,0.f,0.f,1.f);
     
        if (!program->hasOpenGLShaderPrograms())
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
     
     
        if (!program->addShaderFromSourceCode(QGLShader::Vertex,
        "in vec4 vertex;\n"
        "uniform mat4 matrix;\n"
        "void main(void)\n"
        "{\n"
        " gl_Position = matrix * vertex;\n"
        "}\n"))
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
     
        if (!program->addShaderFromSourceCode(QGLShader::Fragment,
        "uniform vec4 color;\n"
        "void main(void)\n"
        "{\n"
        "gl_FragColor = color;\n"
        "}\n"))
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
        if (!program->link())
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
     
    }
     
    void WindowOpengl::resizeGL(int width, int height)
    {
        glMatrixMode(GL_PROJECTION);
        glViewport(0, 0, width, height);
     
    }
     
    void WindowOpengl::paintGL()// draw the scene:
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
        if (!program->bind())
        {
            QMessageBox::information(this, "Beuglage", "Ya une erreur quequepar, tu es vraiment un Zéros !");
        }
        static GLfloat const  triangleVertices[] = {
        1.0f, 1.0f, -5.0f,
        0.0f, 1.0f, -5.0f,
        1.0f, 0.0f, -5.0f
        };
     
        int vertexLocation = program->attributeLocation("vertex");
        int colorLocation = program->uniformLocation("color");
        int matrixLocation = program->uniformLocation("matrix");
     
        QMatrix4x4 pmvMatrix;
        pmvMatrix.perspective(45.0, 1.5, 0.1, 60.0 );
     
        program->enableAttributeArray(vertexLocation);
        program->setAttributeArray(vertexLocation, triangleVertices,3);
        program->setUniformValue(matrixLocation, pmvMatrix);
        program->setUniformValue(colorLocation, QColor(250, 50, 0, 255));
     
        glDrawArrays(GL_TRIANGLES, 0, 3);
     
        program->disableAttributeArray(vertexLocation);
        program->release();
    }
    Edit: si une personne passant par la connait un cours expliquant pédagogiquement et petit a petit l'utilisation des shaders (langage GLSL) et avec des exemples multiples allant de simple a complexe en passant par intermediaire, je suis tout a fait preneur , car ce que l'on trouve generalement est souvent difficile a comprendre pour debuter et progresser petit a petit dans ce domaine.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Je n'ai pas regardé ton code. As tu lu le tutoriel sur QtOpenGL : Utilisation avancée des processeurs graphiques avec Qt ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Par défaut
    Salut,
    Oui j'ai regardé tout ce tutoriel. Je pense qu'il est bien pour des gens ayant déjà des bonnes connaissances. Je trouve que dans les explication c'est bien, mais ça manque d'exemples de niveaux différents, car il n'y a que des bouts de code et quand j'ai regardé le code du gros projet avec les montagnes ^^, il y a mais beaucoup trop de choses d'un coup pour un débutant comme moi. Ceci dit, c'est grâce a ce tutoriel que j'ai réussi a modifier le code que j'ai repompé de la doc de Qt pour le faire fonctionner.
    J'ai trouve un bouquin qui a l'air vraiment bien (excepté qu'il est en anglais ^^), mais si quelqu'un a des cours en ligne, en français si possible, ça serait vraiment cool.
    Et le must du must, ça serait quelqu'un qui a réussi à lier les lib de glew à Qt creator (sans les lib de QGLShader et QGLShaderProgram quoi), moi j'ai pas réussi. Je dis ça car je préférerai apprendre d'une façon vraiment générale, et non pas seulement par les classes de Qt.

    C U

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

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