Can't Get Qt OpenGL to Draw



  • I've been trying to use OpenGL in Qt for the past few hours. I can't seem to figure out why the heck I can't get anything to draw after modifying one of the examples. Here's the shaders for starters. Very simple. Note, I've started trying stupid things...

    in vec3 pos;
    void main()
    {
        gl_Position = vec4(pos, 1.0);
    }
    
    out vec4 fColor;
    void main()
    {
        fColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
    

    I can confirm the shaders are setup fine. No errors. Here's where I create a vertex buffer,

    arrayBuf = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
    arrayBuf->setUsagePattern(QOpenGLBuffer::StaticDraw);
    arrayBuf->create();
    
    GLfloat vertices[6][3] =
    {
        { -0.90f, -0.90f, -1.0f }, // Triangle 1
        { 0.85f, -0.90f, -1.0f },
        { -0.90f, 0.85f, -1.0f },
    
        { 0.90f, -0.85f, -1.0f }, // Triangle 2
        { 0.90f, 0.90f, -1.0f },
        { -0.85f, 0.90f, -1.0f }
    };
    
    arrayBuf->bind();
    arrayBuf->allocate(vertices, sizeof(vertices));
    

    Then to draw

    glClearColor(0.4f, 0.58f, 0.9f, 1.0f);
    
    program.bind();
    arrayBuf->bind();
    
    int vertexLocation = program->attributeLocation("pos");
    program->setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3);
    program->enableAttributeArray(vertexLocation);
    
    glDrawArrays(GL_TRIANGLES, 0, 6);
    
    program->disableAttributeArray(vertexLocation);
    arrayBuf->release();
    program.release();
    

    I got a GL_INVALID_OPERATION setAttributeBuffer. I'd do a more in depth debugging to try and see what's going on but for some reason neither vs graphics debugging or Nividia nsight is working with Qt OpenGL.


  • Lifetime Qt Champion

    Hi,

    Which example did you modify ?

    Did it run successfully before you started fiddling with it ?

    Which version of Qt ?
    On which platform ?



  • Thanks, you motivated me to go back and draw more comparisons from the example. Just didn't want to start over and was so sure I was doing something wrong with the buffers but it turned out to be a problem with the OpenGL version I was asking it to use. On a side note do you have any idea why I can't use a std vector or qlist instead of the array shown above? If I replace GLfloat vertices[6][3]... and arrayBuf->allocate... with

    std::vector<VertexData> data;
    data.push_back(VertexData(-0.9f, -0.9f, -5.0f));
    data.push_back(VertexData(-0.85f, -0.9f, -5.0f));
    data.push_back(VertexData(-0.9f, -0.85f, -5.0f));
    
    data.push_back(VertexData(-0.9f, -0.85f, -5.0f));
    data.push_back(VertexData(-0.9f, -0.9f, -5.0f));
    data.push_back(VertexData(-0.85f, -0.9f, -5.0f));
    ...
    arrayBuf->allocate(&data[0], sizeof(VertexData) * data.size());
    

    Then it doesn't work anymore. I've been able to do this with OpenGL in the past.



  • Hi have you tried Qt examples before? There are many Qt examples available that can help you manage rendering triangles correctly.


  • Lifetime Qt Champion

    Shouldn't you be using data.data for that ? See std::vector::data ?



  • 2017.01.18 Update:
    I draw a rectangle with texture correctly under QtOpenGL framework correctly,the source code u can get here,maybe u can enroll an account to get the code.


    2018.01.17 Update:
    I solve the question by using glDrawArrays rather than glDrawElements, I believe it must have some problems when I tried glDrawElements;


    Origin:
    @jiancaiyang I have encountered the same question when I try to draw a simple white angle,here is my GLWidget Code,my qt version is 5.6msvc.I intimate code from OpenGL OpenGLTutrioal

    glwidget.h:

    #ifndef GLWIDGET_H
    #define GLWIDGET_H
    #include <QOpenGLWidget>
    #include <QOpenGLShaderProgram>
    #include <QVector3D>
    #include <QOpenGLFunctions>
    
    class GLWidget : public QOpenGLWidget ,public QOpenGLFunctions
    {
        Q_OBJECT
    
    public:
        GLWidget(QWidget *parent = 0);
        ~GLWidget();
    
        QSize sizeHint() const;
    
    protected:
        void initializeGL() Q_DECL_OVERRIDE;
        void resizeGL(int width,int height) Q_DECL_OVERRIDE;
        void paintGL();
    
    private:
        QMatrix4x4 pMatrix;
        QOpenGLShaderProgram shaderProgram;
        QVector<QVector3D> vertices;
    
    };
    
    #endif // GLWIDGET_H
    
    

    glwidget.cpp:

    #include "glwidget.h"
    
    GLWidget::GLWidget(QWidget *parent)
    {
    
    }
    
    GLWidget::~GLWidget()
    {
    
    }
    
    QSize GLWidget::sizeHint() const
    {
        return QSize(640,480);
    }
    
    void GLWidget::initializeGL()
    {
        initializeOpenGLFunctions();
    
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_CULL_FACE);
    
        glClearColor(0.0f,0.0f,0.0f,1.0f);
    
        bool ok;
        ok = shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/vertexShader.vsh");
        ok = shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/fragmentShader.fsh");
        ok = shaderProgram.link();
    
    
        vertices << QVector3D(1,0,-2) << QVector3D(0,1,-2) << QVector3D(-1,0,2);
    
    }
    
    void GLWidget::resizeGL(int width, int height)
    {
        if ( height == 0 )
        {
            height = 1;
        }
    
        pMatrix.setToIdentity();
        pMatrix.perspective(60.0,(float)width / (float)height,0.001,1000);
    
        glViewport(0,0,width,height);
    
    }
    
    void GLWidget::paintGL()
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        QMatrix4x4 mMatrix;
        QMatrix4x4 vMatrix;
    
        bool ok;
        ok = shaderProgram.bind();
    
        shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
    
        shaderProgram.setUniformValue("color",QColor(Qt::white));
    
        shaderProgram.setAttributeArray("vertex", vertices.constData());
        shaderProgram.enableAttributeArray("vertex");
    
        glDrawArrays(GL_TRIANGLES, 0, vertices.size());
    
        shaderProgram.disableAttributeArray("vertex");
        shaderProgram.release();
    }
    

    vertexShader.vsh:

    uniform mat4 mvpMatrix;
    
    in vec4 vertex;
    
    void main(void)
    {
        gl_Position = mvpMatrix * vertex;
    }
    
    

    fragmentShader.fsh:

    uniform vec4 color;
    
    out vec4 fragColor;
    
    void main(void)
    {
        fragColor = color;
    }
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.