1

http://www.opengl.org/wiki/Vertex_Specification_Best_Practicesによると、動的 VBO セクションの下で、シーンが頻繁に変更される場合は VBO タイプを GL_DYNAMIC_DRAW に設定することをお勧めします。さらに、バッファ全体を更新する必要がある場合は、glBufferSubData だけを使用しないでください。代わりに glBufferData を使用し、そのデータ ポインターを NULL に設定してから、glBufferSubData を呼び出してデータを VBO にロードすることができます。

私が書いているQtプログラムでまさにそれを行っています。これにより、ユーザーはOpenGL描画可能領域(QGLWidget)のサイズを変更できます。これにより、表示されるデータの多かれ少なかれに基づいて一連の線(ある種のワイヤーフレーム)が強制的に再描画されます指定された QGLWidget で。最初の最初のサイズ変更後に機能する最初の作業例があります。プログラムは次のようになります。

もう一度サイズを変更すると、アプリケーションは次のようになります。

問題を絞り込んで、回線に関連付けられた VBO を再ロードしました。ラインに関連付けられた頂点属性をロードするコードは次のとおりです。

  bool batch_renderer::load_data(render_data_type &data, GLsizei buffer_count)
  {
    if (_vbo_id) {
      glBindBuffer(GL_ARRAY_BUFFER, _vbo_id);
      glDeleteBuffers(_byte_count, &_vbo_id);
      _vbo_id = 0;
      _vertex_count = 0;
      _byte_count = 0;
      _byte_count1 = 0;
      _byte_count2 = 0;
      _byte_count3 = 0;
      _byte_count4 = 0;
    }

    _vertex_count = data._data_1.size();
    _byte_count = data.size_of();

    glGenBuffers(buffer_count, &_vbo_id);
    if (bind()) {
      glBufferData(GL_ARRAY_BUFFER, _byte_count, NULL, GL_DYNAMIC_DRAW);
      switch (data._type_count) {
      case (4): {
        _byte_count4 = data.data4_size_of();
        size_t offset = data.t4_offset();
        glBufferSubData(GL_ARRAY_BUFFER, offset, _byte_count4,
          data._data_4.data());
      }
      case (3): {
        _byte_count3 = data.data3_size_of();
        size_t offset = data.t3_offset();
        glBufferSubData(GL_ARRAY_BUFFER, offset, _byte_count3,
          data._data_3.data());
      }
      case (2): {
        _byte_count2 = data.data2_size_of();
        size_t offset = data.t2_offset();
        glBufferSubData(GL_ARRAY_BUFFER, offset, _byte_count2,
          data._data_2.data());
      }
      case (1): {
        _byte_count1 = data.data1_size_of();
        size_t offset = data.t1_offset();
        glBufferSubData(GL_ARRAY_BUFFER, offset, _byte_count1,
          data._data_1.data());
      }
        break;
      default: {
        return false;
      }
      }
    } else {
      return false;
    }

    return true;
  }

VBOを再ロードするソースをコメントアウトすると、サイズ変更イベントの後、プログラムは次のようになります。

ここで VBO を使って線がうまくいかず、テクスチャがすべて台無しになる原因は何ですか?

4

1 に答える 1