[Solved] QOpenGLWidget and CoreProfile : nothing displayed when using setVersion option



  • Hi,

    I've met a very strange error while using OpenGl with Qt 5.4.

    I use the new QOpenGLWidget class, and OpenGL Core Profile.

    If I choose a version for OpenGL, (3.1, 3.3, 4.3, etc...) then nothing is displayed !
    I just have the screen filled with the clear color

        format.setVersion(4, 4);
        format.setProfile(QSurfaceFormat::CoreProfile);
        format.setDepthBufferSize(24);
        format.setStencilBufferSize(8);
        QSurfaceFormat::setDefaultFormat(format);
    

    If I don't choose any version, graphics are displayed.

        format.setProfile(QSurfaceFormat::CoreProfile);
        format.setDepthBufferSize(24);
        format.setStencilBufferSize(8);
        QSurfaceFormat::setDefaultFormat(format);
    

    What's wrong with this option ?
    The problem is that I want to port my code from Linux to Max and that I have to use this setVersion option on Mac...

    Thanks,
    Soax


  • Moderators

    It's hard to say without seeing the whole code. You're probably using some functionality that is deprecated and not present in the newer core profiles. Another possibility is that you don't meet some requirements for correct rendering setup in core profile.

    One such requirement is that in core profiles (starting with 3.something, I don't remember which) you must use a VAO. If you don't have any VAO specific code it's enough to create one, bind it and never touch again until the end of program where you release it.



  • Hi thank you for your answer,

    First I did'nt use VAO, then I added the

    format.setProfile(QSurfaceFormat::CoreProfile);
    

    and nothing was displayed. Then I added VAO and display was back.

    Then I added this single line

    format.setVersion(4, 4);
    

    and again nothing is displayed. I tried with several version (3.1, 3.3, 4.1, 4.4), but without change.

    Here is my initialisation code :

    build_program();
    
    model = glm::mat4(1.0f);
    view = glm::mat4(1.0f);
    projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
    mvp = projection * view * model;
    
    glGenBuffers(1, &vbo_id);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_c) + sizeof(texture_c), NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices_c), vertices_c);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices_c), sizeof(texture_c), texture_c);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    #ifndef QT_WINDOW_H
    glGenVertexArrays(1, &vao_id);
    glBindVertexArray(vao_id);
    #else
    m_vao.create();
    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
    #endif
    glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
    
    glVertexAttribPointer(attribute_vc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(attribute_vc);
    glVertexAttribPointer(attribute_tc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices_c)));
    glEnableVertexAttribArray(attribute_tc);
    
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    #ifndef QT_WINDOW_H
    glBindVertexArray(0);
    #endif
    

    And here is my paint code :

    update();
    
    glViewport(pos_x, *(this->win_height) - pos_y - height, width, height);
    
    glUseProgram(program);
    #ifndef QT_WINDOW_H
    glBindVertexArray(vao_id);
    #else
    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
    #endif
    glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, &mvp[0][0]);
    glUniform1i(uniform_number_of_textures, number_of_textures);
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture_id);
    glUniform1i(uniform_texture, 0);
    
    glDrawArrays(GL_QUADS, 0, 4);
    
    glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
    #ifndef QT_WINDOW_H
    glBindVertexArray(0);
    #endif
    glUseProgram(0);
    


  • What I do not understand is why it doesn't work when I set the version but works when the version is not set.
    In both cases I set the profile to CoreProfile.

    When the version is not set, it's version 4.4 that is used (according to GL_VERSION), and it works fine.
    But when I set the version to 4.4 (the same), it doesn't work...


  • Moderators

    If I recall correctly an OpenGL implementation is free to give you a "close enough" superset of what you requested if the specific context is not available.

    If you don't specify a version I believe it tries to create a 2.1 context. Since 2.x version don't have a core profile the implementation is free to give you any kind of superset and you are getting a 4.4 compatible profile (not the core one).

    When you set the version explicitly to 4.4 it has a core profile so that's what is selected.

    So I suspect your code still doesn't run in core profile, it's just that you're getting a compatible profile by mistake.



  • Thanks a lot !

    I checked with

    context()->format().profile();
    

    once the context is created and the code is not running in core profile if there is not a particular version specified...

    This should be mentionned in Qt QSurfaceFormat documentation.


Log in to reply
 

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