Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt opengl drawArrays dans un widget

    25 mars 2019 à 15:02:47

    Hello tout le monde!
    Alors voilà, j'étais en train de faire un projet OpenGL, où je fais mon rendu dans un contexte opengl.
    Mais voilà; j'aimerai rajouter une interface graphique à tout ce tsointsoin, et j'ai bien envie de le faire avec Qt (j'ai cru lire qu'il était assez facile de faire le lien entre les 2) (je ne suis un expert ni en Qt, ni en OpenGL, je précise).
    Actuellement, tous les tutoriels que j'ai pu lire c'est pour dessiner des trucs sur une fenetre avec des QPainter.

    Ma question serait : Comment je fais pour faire un rendu opengl dans une fenêtre Qt?

    Par exemple, dans mon main actuel je fais à un moment :

    inlierShader.use();
    inlierShader.setMat4("viewproj", viewProj);
    model = glm::mat4();
    inlierShader.setMat4("model", model);
    glBindVertexArray(GLOBAL::VAOp);
    glDrawArrays(GL_POINTS, 0, (GLsizei)GLOBAL::reconstruction3D.size());
    if (GLOBAL::print_Other)
       glDrawArrays(GL_POINTS, (GLsizei)GLOBAL::reconstruction3D.size(), (GLsizei)GLOBAL::loaded_points.size());


    Comment je peux faire pour que mon Drawarray draw dans un QWidget plutôt que dans ma window opengl?

    Désolé si la réponse est trivial, j'ai cherché, mais peut-être que je n'arrive pas a exprimer ma pensée dans un anglais suffisamment correct pour trouver une réponse sur internet :/
    Si il y a une classe Qt qui fait ça, je suis pas tombé dessus :/

    Merci beaucoup!

    • Partager sur Facebook
    • Partager sur Twitter

    « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
    D. Mendeleïev

      25 mars 2019 à 16:23:14

      :waw:

      :euh:

      :-°:-°

      Oups...  Merci pour le lien ! et désolé du dérangement

      • Partager sur Facebook
      • Partager sur Twitter

      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
      D. Mendeleïev

        28 mars 2019 à 8:57:27

        Je profite de ce post pour poser une autre question ...


        J'ai donc une classe qui dérive de QOpenGLWidget, dans laquelle j'ai override les fonctions initializeGL(), paintGL(), et resizeGL().
        J'ai crée un tableau avec des positions, et un tableau avec des couleurs comme ceci :

        static const QVector3D positions[] = {
        	QVector3D(0.0f, 0.75f ,1.0f),
        	QVector3D(-0.75f, -0.75f, 1.0f),
        	QVector3D(0.75f, -0.75f, 1.0f)
        };
        static const QVector3D colors[] = {
        	QVector3D(1.0f, 0.0f ,0.0f),
        	QVector3D(0.0f, 1.0f, 0.0f),
        	QVector3D(0.0f, 0.0f, 1.0f)
        };

        . et comme shader j'utilise quelque chose de très simple :

        vertex Shader:

        #version 330 core
        layout(location = 0) in vec3 position;
        layout(location = 1) in vec3 color;
        out vec4 vColor;
        
        void main()
        {
          gl_Position = vec4(position, 1.0);
          vColor = vec4(color, 1.0f);
        }

        et fragment Shader :

        #version 330 core
        
        in vec4 vColor;
        out vec4 fColor;
        
        void main()
        {
           fColor = vec3(1.0f, 0.0f, 0.0f, 0.0f );//vColor;
        }

        Le problème que j'ai, c'est que quand j'affiche mon triangle, la couleur n'est pas prise en compte. C'est à dire que j'obtiens un fond rouge (j'ai clearcolor en rouge) avec un triangle noir à l'interieur.

        Le code pour InitializeGL :

        void Painter::initializeGL()
        {
        	QOpenGLFunctions::initializeOpenGLFunctions();
        	//connect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(teardownGL()), Qt::DirectConnection);
        	{
        
        		glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
        		// Create Shader (Do not release until VAO is created)
        		m_shaderProg = new QOpenGLShaderProgram();
        		m_shaderProg->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/simple.vert");
        		m_shaderProg->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/simple.frag");
        		//J'en profite pour dire que mes shaders sont bien dans un sous-dossier nommé "shaders"
        m_shaderProg->link(); m_shaderProg->bind(); // Create Vertex Array Object m_VAO.create(); m_VAO.bind(); // Create Buffer (Do not release until VAO is created) m_VBOs.resize(2); m_VBOs[0].create(); m_VBOs[0].bind(); m_VBOs[0].setUsagePattern(QOpenGLBuffer::StaticDraw); m_VBOs[0].allocate(positions, 3 * 3 * sizeof(float)); m_shaderProg->enableAttributeArray(0); m_shaderProg->setAttributeBuffer(0, GL_FLOAT, 0, 3); m_VBOs[1].create(); m_VBOs[1].bind(); m_VBOs[1].setUsagePattern(QOpenGLBuffer::StaticDraw); m_VBOs[1].allocate(colors, 3 * 3 * sizeof(float)); m_shaderProg->enableAttributeArray(1); m_shaderProg->setAttributeBuffer(1, GL_FLOAT, 0, 3); // Release (unbind) all for (auto& m_VBO : m_VBOs) m_VBO.release(); m_VAO.release(); m_shaderProg->release(); } }

        et PaintGL :

        void Painter::paintGL()
        {
        	glClear(GL_COLOR_BUFFER_BIT);
        
        	m_shaderProg->bind();
        	{
        		m_VAO.bind();
        		glDrawArrays(GL_TRIANGLES, 0, 3);
        		m_VAO.release();
        	}
        	m_shaderProg->release();
        }


        J'ai donc l'impression que ma couleur n'est pas prise en compte dans initializeGL(). Mais je comprends pas pourquoi j'arrive quand même a dessiner le triangle ...

        Est-ce que quelqu'un peut m'aider? :/




        -
        Edité par KirbXCoucou 28 mars 2019 à 8:59:58

        • Partager sur Facebook
        • Partager sur Twitter

        « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
        D. Mendeleïev

          29 mars 2019 à 0:22:08

          Lu',

          La fonction addShaderFromSourceFile retourne un booléen pour savoir si la compilation des shaders s'est bien passée. Normmalement la ligne 12 de initializeGL doit retourner false parceque dans ton fs, tu initialises un vec3 avec 4 valeurs...

          Sinon c'est pas trés interressant de dessiner un objet rouge sur un fond rouge...

          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            29 mars 2019 à 8:21:27

            Ouais! J'ai trouvé mon erreur finalement! ...
            Enfait, je dessinais un objet rouge sur un fond rouge parceque l'objet était noir justement, et que je voulais voir si j'arrivais à le rendre rouge,
            Mais mon erreur venais du chemin d'acces à mes shaders... je suis stupide!
            merci de l'aide en tout cas! :)
            • Partager sur Facebook
            • Partager sur Twitter

            « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
            D. Mendeleïev

              19 juillet 2019 à 17:13:19 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


              Qt opengl drawArrays dans un widget

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown