1

だから私は複数のタブを持つ Qt アプリケーションを持っています。タブの 1 つに、VAO/VBO を使用してプリミティブをレンダリングしようとしている QGLWidget があります。

私の初期化コードは次のようになります。

    glGenVertexArrays(1, &vao);
    glGenBuffers(2, buffer);

    glBindVertexArray(vao);
    glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), &normals[0], GL_STATIC_DRAW);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);  // Unbind VAO

そして、paintGL() ループの描画コードは次のようになります。

    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, vertices/3);
    glBindVertexArray(0);

QGLWidget を含む私のタブが最初に表示されている限り、これは正常に機能します。ただし、QGlWidget が最初に表示されない場合、これは機能しません。VAO/VBO の初期化は正しく行われます (glGetError() でこれを確認したところ問題ないようです)。ただし、描画/ペイント ループが直後に呼び出されないためです (paintGL をトリガーするには、GL タブに切り替える必要があります)。 draw)、GL タブに切り替えても何もレンダリングされません。繰り返しますが、QGLWidget を最初のタブにすると、初期化の直後に描画がトリガーされ、すべてが正常にレンダリングされます。

これはなぜでしょうか?ここで何か不足していますか?描画ループ/paintGLが直後に発生しない場合、VAO/VBOの初期化が機能しない理由はありますか?

私はシェーダーを使用していないことにも言及する必要があると思います。これはレガシー アプリケーションなので、ゆっくりと更新を開始しています。最初のステップは、頂点をカードに取得することでした。もともと、VAO/VBO の代わりに glEnableClientState の呼び出しを使用していましたが、変換はすべてマトリックス スタックを介して処理され、色は glColor を介して指定されます。

4

0 に答える 0