Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to draw a triangle by Qt5 and openGL(without QPainter)?
QtWS25 Last Chance

How to draw a triangle by Qt5 and openGL(without QPainter)?

Scheduled Pinned Locked Moved General and Desktop
7 Posts 2 Posters 6.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    stereomatching
    wrote on last edited by
    #1

    OS : mac osx 10.8.3
    compiler : clang3.2

    I am a beginner of opengl, trying to play opengl with Qt5

    There are two problems about this simple program(plot a triangle)
    1 : I can't see the triangle
    2 : The program could not exit even I close the window

    hpp
    @
    #ifndef CH1HELLOTRIANGLE_HPP
    #define CH1HELLOTRIANGLE_HPP

    #include <QGLWidget>

    #include <QtGui/QOpenGLFunctions>
    #include <QtGui/QOpenGLShaderProgram>

    class QWidget;

    class ch1HelloTriangle : public QGLWidget, protected QOpenGLFunctions
    {
    Q_OBJECT
    public:
    explicit ch1HelloTriangle(QWidget *parent = 0);

    protected:
    virtual void initializeGL();
    void initShaders();
    void InitializeVertexBuffer();

    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    

    private:
    QOpenGLShaderProgram program;

    GLuint positionBufferObject;
    

    };

    #endif // CH1HELLOTRIANGLE_HPP
    @

    .cpp
    @
    #include <locale.h>

    #include <QWidget>

    #include "ch1HelloTriangle.hpp"

    namespace
    {

    float const vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
    };

    }

    ch1HelloTriangle::ch1HelloTriangle(QWidget *parent) :
    QGLWidget(parent)
    {
    }

    void ch1HelloTriangle::initializeGL()
    {
    initializeOpenGLFunctions();
    InitializeVertexBuffer();
    initShaders();
    }

    void ch1HelloTriangle::initShaders()
    {
    // Override system locale until shaders are compiled
    setlocale(LC_NUMERIC, "C");

    // Compile vertex shader
    if (!program.addShaderFromSourceCode(QOpenGLShader::Vertex,
                                         "attribute vec4 position;\n"
                                         "void main()\n"
                                         "{\n"
                                         "   gl_Position = position;\n"
                                         "}\n"))
    {
        close();
    }
    
    // Compile fragment shader
    if (!program.addShaderFromSourceCode(QOpenGLShader::Fragment,
                                         "out vec4 outputColor;\n"
                                         "void main()\n"
                                         "{\n"
                                         "   outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"
                                         "}\n"))
    {
        close();
    
    }
    
    // Link shader pipeline
    if (!program.link())
        close();
    
    // Bind shader pipeline for use
    if (!program.bind())
        close();
    
    // Restore system locale
    setlocale(LC_ALL, "");
    

    }

    void ch1HelloTriangle::InitializeVertexBuffer()
    {
    glGenBuffers(1, &positionBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    }

    void ch1HelloTriangle::resizeGL(int w, int h)
    {
    // Set OpenGL viewport to cover whole widget
    glViewport(0, 0, w, h);
    }

    void ch1HelloTriangle::paintGL()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    
    int vertexLocation = program.attributeLocation("position");
    program.enableAttributeArray(vertexLocation);
    
    glVertexAttribPointer(vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
    
    glDrawArrays(GL_TRIANGLES, 0, 3);    
    

    }

    @

    main.cpp
    @
    #include <QApplication>

    #include "ch1HelloTriangle.hpp"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);

    ch1HelloTriangle ch1;
    ch1.show();
    
    return a.exec(&#41;;
    

    }
    @

    [[merged second topic about the same problem with this one, Tobias]]

    1 Reply Last reply
    0
    • S Offline
      S Offline
      stereomatching
      wrote on last edited by
      #2

      OS : mac osx 10.8.3
      compiler : clang3.2

      How could I draw a triangle by Qt5 and openGL?
      I tried it like this way
      "Fail to generate a triangle by openGL(Qt5.0.2)":http://qt-project.org/forums/viewthread/27513/

      I don't know why, but the codes can not work
      Could you show me a correct way to draw a triangle in Qt5?
      I keep trying and finding the solutions but can't even draw a single triangle in Qt5
      Thanks

      1 Reply Last reply
      0
      • S Offline
        S Offline
        stereomatching
        wrote on last edited by
        #3

        After a lot of trial and error, I solved the problem.

        Change two things :
        1 : read the shader by files

        @// Compile vertex shader
        if (!program.addShaderFromSourceFile(QOpenGLShader::Vertex, "modernOpenGLShader/ch1/vertex")){
        QMessageBox::warning(this, "QOpenGLShader::Vertex", "QOpenGLShader::Vertex" + program.log());
        close();
        }

        // Compile fragment shader
        if (!program.addShaderFromSourceFile&#40;QOpenGLShader::Fragment, "modernOpenGLShader/ch1/frag"&#41;){
            QMessageBox::warning(this, "QOpenGLShader::Fragment", "QOpenGLShader::Fragment" + program.log());
            close();    
        }@
        

        2 : change the fragment shader, remove the output variable

        @void main() {
        //set every drawn pixel to white
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
        }@

        From the websites, "modern opengl":http://www.arcsynthesis.org/gltut/
        and "another site":tomdalling.com/blog/modern-opengl/01-getting-started-in-xcode-and-visual-cpp/

        The output qualify should exist(atleast the codes of the second website will work on my pc)
        But Qt will throw error message

        QOpenGLShader::FragmentERROR: 0:4: Invalid qualifiers 'out' in global variable context

        Do anyone know why?Thanks

        1 Reply Last reply
        0
        • Z Offline
          Z Offline
          ZapB
          wrote on last edited by
          #4

          Whether you need to declare the output variable in the fragment shader depends upon which version of OpenGL and GLSL you are using. By default Qt requests an OpenGL 2.x context which has a pre-defined gl_FragColor output variable, hence your error.

          If you were to request an OpenGL 3.2 Core Profile context (see QGLFormat with QGLWidget or QSurfaceFormat with QWindow) then this has no pre-defined gl_FragColour and you are required to declare your own output variable(s) such as you had originally in this thread.

          Hope this helps explain it.

          Nokia Certified Qt Specialist
          Interested in hearing about Qt related work

          1 Reply Last reply
          0
          • S Offline
            S Offline
            stereomatching
            wrote on last edited by
            #5

            @ZapB, thanks for your response, it would be good if I can find some openGL + Qt5 tutorials for beginners, if the tutorials could show us how to write portable openGL codes(include GLSL) would be better.

            1 Reply Last reply
            0
            • Z Offline
              Z Offline
              ZapB
              wrote on last edited by
              #6

              OK. I'll prepare another blog post on this as several people have now asked for this type of tutorial.

              Nokia Certified Qt Specialist
              Interested in hearing about Qt related work

              1 Reply Last reply
              0
              • S Offline
                S Offline
                stereomatching
                wrote on last edited by
                #7

                @ZapB, thanks, please let us know when the blog are ready :)

                1 Reply Last reply
                0

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved