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. Difference between binding VBO data in "InitializeGL" and "play time"
Forum Updated to NodeBB v4.3 + New Features

Difference between binding VBO data in "InitializeGL" and "play time"

Scheduled Pinned Locked Moved Solved General and Desktop
5 Posts 2 Posters 907 Views 1 Watching
  • 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
    sylorr
    wrote on last edited by sylorr
    #1

    Hi All,

    I am still new to OpenGL and Qt. Thanks for clicking into my post!

    I want to draw a bunch of points inside my window (4MB). The way I did it is via QOpenGLWidget, and inherit QOpenGLFunctions_3_3_core. Firstly, I bind the data to VAO & VBO normally, and draw in "paintGL" via "glDrawArrays(GL_POINTS, 0, size)". It works like a charm, no problem.

    However, now I want to add a switch on/off option to display my points. And also bind my data dynamically. Say I implement a keyPressEvent, when I press "D", it starts "bindVertexArray, bindBuffer, bufferData" blahblah. Now it won't render anything. (sometimes a single point)

    Now my question is why that happens? Do I need to assign "glBufferData" another thread to not to block render thread?

    Thanks.
    Note: Ubuntu16.04, Qt5.6, OpenGL3.3


    One guess is that glBufferData() should be in another separated thread other than paintGL(). Since the data I bind is about 4MB, it might block the thread of paintGL(). However, even so, I think it would still be able to render something later some frames.

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

      Hi I finally got it. Previously I thought glGenBuffers() has allocated some places for me. However, it didn't. Dat's why I cannot attach/update my data during render loop. I should fill in some random data with enough size length to be as a placeholder.

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #2

        Hi,

        You should post your code so that more people can take a look at to see what might be happening.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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

          Hi thanks for reminding, there it is

          void MyGLWidget::initializeGL()
          {
              initializeOpenGLFunctions();
          
              camera_pos_ = glm::vec3(0.0f, 0.0f, 50.0f);
              camera_dir_ = glm::vec3(0.0f, 0.0f, -1.0f);
              camera_up_ = glm::vec3(1.0f, 0.0f, 0.0f);
              map_model_ = glm::mat4(1.0f);
              projection_ = glm::perspective(glm::radians(45.0f), (float)width()/(float)height(), 0.1f, 1000.0f);
              view_ = glm::lookAt(camera_pos_, camera_pos_ + camera_dir_, camera_up_);
          
              shader_points = GLShader(context()->functions(), ":/resource/points.vs", ":/resource/points.fs");
              shader_points.use();
              shader_points.setVec3("color", 1.0f, 1.0f, 0.0f);
              shader_points.setMat4("model", model_);
              shader_points.setMat4("view", view_);
              shader_points.setMat4("projection", projection_);
          
              glGenVertexArrays(1, &vao_points);
              glGenBuffers(1, &vbo_points);
              // Part 1---------------------
              glBindVertexArray(vao_points);
              glBindBuffer(GL_ARRAY_BUFFER, vbo_points);
              glBufferData(GL_ARRAY_BUFFER, sizeof(float) * points.size(), &points[0], GL_DYNAMIC_DRAW);
              glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
              glEnableVertexAttribArray(0);
              glBindVertexArray(0);  
              // Part 1 ends----------------
          }
          
          void MyGLWidget::paintGL()
          {
              glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
              glClear(GL_COLOR_BUFFER_BIT);
              if(render_points){
                  shader_points.use();
                  glBindVertexArray(vao_points);
                  glDrawArrays(GL_POINTS, 0, points.size());
              }
          }
          
          void MyGLWidget::keyPressEvent(QKeyEvent *event)
          {
              if(event->key() == Qt::Key_Q){
                  std::cout << "could render" << std::endl;
                  render_points = true;
                  // Part 1 place holder
                  // code
              }
          }
          

          Basically, I set a "Q" press event to turn on the rendered points. In "points", it is a vector of float, It's around 4MB data in total and I load it from fstream at the beginning (in constructor). The above code could normally render on my QOpenGLWidget.
          However when I move my "glBufferData()" part (Part1 in initializeGL()) to keyPressEvent() (Part1 place holder), it won't render anything.

          I think it's probably I should separate the render thread and glBufferData() thread. Perhaps what happens is that the BufferData thread blocks render thread. If so, would TheadPool in Qt help with it? I haven't wrote some real multi-thread code before...So seeking for advice, thanks a lot.

          1 Reply Last reply
          0
          • SGaistS SGaist

            Hi,

            You should post your code so that more people can take a look at to see what might be happening.

            S Offline
            S Offline
            sylorr
            wrote on last edited by
            #4

            @SGaist May I ask if paintGL() would automatically swapBuffer()?

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

              Hi I finally got it. Previously I thought glGenBuffers() has allocated some places for me. However, it didn't. Dat's why I cannot attach/update my data during render loop. I should fill in some random data with enough size length to be as a placeholder.

              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