Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Game Development
  4. Why my triangle is centered (Using QOpenGLWidget, basic stuff)
Forum Updated to NodeBB v4.3 + New Features

Why my triangle is centered (Using QOpenGLWidget, basic stuff)

Scheduled Pinned Locked Moved Unsolved Game Development
5 Posts 3 Posters 1.9k 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.
  • M Offline
    M Offline
    Mernion
    wrote on 30 Jan 2017, 15:21 last edited by Mernion
    #1

    I was learning OpenGL, made some basics triangles on visual studio with GLFW and everything worked nice.
    Now I want to try out Qt with OpenGL and encountered strange thing with vertices coordinates.

    I made a simple working example of my VS & GLFW code in Qt with QOpenGLWidget, but result is other. It looks like my Y coordinate gets normalized to 0.0f instead of 1.0f.
    OpenGLBug.jpg

    I dont understand why this is happens. Coordinates on X axis works as they should.

    My code:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QSurfaceFormat format;
        format.setVersion(3,3);
        format.setProfile(QSurfaceFormat::CoreProfile);
        SimpleRender render(format);
        render.show();
    
        return a.exec();
    }
    
    
    SimpleRender::SimpleRender(const QSurfaceFormat& format, QWidget* parent) : QOpenGLWidget(parent),
        VBO(QOpenGLBuffer::VertexBuffer),
        VAO(this)
    {
        setFormat(format);
    }
    
    void SimpleRender::initializeGL()
    {
        context()->create();
        makeCurrent();
    
        qDebug() << "OpenGL format major version =" <<context()->format().majorVersion() << "\n";
    
        glFun = context()->versionFunctions<QOpenGLFunctions_3_3_Core>();
        glFun->initializeOpenGLFunctions();
    
        QVector<GLfloat> vertices = {
            -1.0f, -1.0f, 0.0f,
            1.0f, -1.0f, 0.0f,
            0.0f, 1.0f, 0.0f
        };
    
        QOpenGLShader vertexShader(QOpenGLShader::Vertex, this);
        QOpenGLShader fragmentShader(QOpenGLShader::Fragment, this);
    
        QFile vertexShaderFile(":/shaders/vertexshader.vsh");
        if (!vertexShaderFile.exists())
            qDebug() << "Vertex shader file not found\n";
    
        if (!vertexShader.compileSourceFile(vertexShaderFile.fileName()))
            qDebug() << "Vertex shader compile error\n" << vertexShader.log() << "\n";
    
        QFile fragmentShaderFile(":/shaders/fragmentshader.fsh");
        if (!fragmentShaderFile.exists())
            qDebug() << "Fragmenth shader file not found\n";
        if (!fragmentShader.compileSourceFile(fragmentShaderFile.fileName()))
            qDebug() << "Fragment shader compile error\n" << fragmentShader.log() << "\n";
    
        shaderProgram.addShader(&vertexShader);
        shaderProgram.addShader(&fragmentShader);
        if (!shaderProgram.link())
            qDebug() << "Shader program link error\n" << shaderProgram.log() << "\n";
    
    
        VAO.create();
        VAO.bind();
    
        VBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
        VBO.create();
        VBO.bind();
        VBO.allocate(&vertices, vertices.count() * sizeof(vertices));
    
        // normalization is off, so we using plain opengl functions
    
        glFun->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
        glFun->glEnableVertexAttribArray(0);
    
        VAO.release();
    
        qDebug() << "size of vertices = " << sizeof(vertices) << "\n";
        qDebug() << "size of GL_FLOAT = " << sizeof(GL_FLOAT) << "\n";
    
    }
    
    void SimpleRender::resizeGL(int w, int h)
    {
        glFun->glViewport(0,0, w, h);
        qDebug() << "new width =" << w << "\n";
        qDebug() << "new height =" << h << "\n";
    }
    
    void SimpleRender::paintGL()
    {
        glFun->glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glFun->glClear(GL_COLOR_BUFFER_BIT);
    
        shaderProgram.bind();
        VAO.bind();
        glFun->glDrawArrays(GL_TRIANGLES, 0, 3);
        VAO.release();
    
    }
    

    I dont get any info from qDebug(), so everything compiles without errors.

    1 Reply Last reply
    0
    • J Offline
      J Offline
      johngod
      wrote on 30 Jan 2017, 21:17 last edited by
      #2

      Hi

      You didnt post your shaders, but from your resizeGL() and paintGL() functions I can see that you didnt define any view or projection matrix.

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Mernion
        wrote on 31 Jan 2017, 07:16 last edited by
        #3

        Vertex shaders just fill gl_Position with vertices position without any modifications, and fragment shader just fill out vec4 color.

        I suppose basic triangle should work without any matrix stuff? It worked with GLFW or this is some stuff that depens on platform, not on opengl?

        1 Reply Last reply
        0
        • J Offline
          J Offline
          johngod
          wrote on 31 Jan 2017, 12:31 last edited by johngod
          #4

          I just notice that in this line of code

          glFun->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);

          you are defining a stride, but your vertices are compact, so please try:

          glFun->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);

          Regarding mapping the y coordinate, not sure if it is platform dependent but I just tested it and it works good on QOpenGLWidget, it maps the window corners to (-1, 1). If you need to map to other range you will need to use matrices, check this example: https://bitbucket.org/joaodeusmorgado/opengltutorials/src/314b981b60d64dd59498b4c6b96ab2aa61bc9be2/T10_MatrixTransforms_ortho/mygl.cpp?at=master&fileviewer=file-view-default

          1 Reply Last reply
          0
          • M Offline
            M Offline
            matthew.kuiash
            wrote on 8 Feb 2017, 09:14 last edited by matthew.kuiash 2 Aug 2017, 21:53
            #5

            Hi,

            I'm not saying this is the problem but this code looks a bit weird.

            EDIT: It looks to me that you're passing the address of QVector<GLfloat> and not the actual address of the GLfloats. Convert this to a standard C array GLfloat data[9] = { immediates }; and see what happens. I assume VBO is a QOpenGLBuffer and there's no special overload for QVector<GLfloat>. It just takes a void *.

            VBO.allocate(&vertices, vertices.count() * sizeof(vertices));
            

            Looks like you're uploading X vertices but the sizeof is sizeof(QVector<GLfloat>). That's unlikely to be what you mean and could assplode on some paranoid machines (likely you'd walk off the end of the vertex array of sizeof(QVector<GLfloat>) is > sizeof(GLfloat)).

            I'd take the advice of @johngod on the stride (although, IIRC that setting is OK. It's the size of each attribute element not the gap between them).

            Also, if you have one, try this on another device/machine. You'd be amazed how many times my GL code works differently across desktop and Android platforms. Not even consistent between Android machines.

            @johngod One doesn't have to use matrices! I don't use matrices in GL all the time!

            The legendary cellist Pablo Casals was asked why he continued to practice at age 90. "Because I think I'm making progress," he replied.

            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