0

貼り付けなければならないコードが多すぎます。私はチュートリアルに従っていますが、自分でそれらを実装しようとすると、何もうまくいかないようです. glMapBuffer以下にルーチンを貼り付けます。vertex_typerender_targetは、ユーザーがこれらの列挙値を自分で設定できるテンプレート化されたパラメーターであることに注意してください。

何が起こっているかのイメージです。

これは、VBO の内容を変更することによって、正方形が画面の右上隅に向かってゆっくりと直線的に移動していることを示しています。

bool modify_vertex_data(
  std::vector<vertex_2d_renderer_type<vertex_type> > &data,
  GLsizeiptr start_index) {

  if (!vertex_vbo_pointer_ || (start_index + data.size()) >
    static_cast<uint32_t>(vertex_count_)) {

    return false;
  }
  glBindBuffer(render_target, vertex_vbo_pointer_);
  vertex_2d_renderer_type<vertex_type> *vbo_data;
  vbo_data = reinterpret_cast<vertex_2d_renderer_type<vertex_type> *>(
    glMapBuffer(render_target, modify_access));

  memcpy(vbo_data, data.data(),
    data.size() * sizeof(vertex_2d_renderer_type<vertex_type>));

  return (glGetError() == GL_NO_ERROR) && glUnmapBuffer(render_target);
}

これを呼び出すコードは次のとおりです。

void QtRenderer::paintGL() {
  //makeCurrent();
  count_++;

  glMatrixMode(GL_PROJECTION);
  glEnable(GL_SCISSOR_TEST);
  glDisable(GL_DEPTH_TEST);
  glLoadIdentity();
  glViewport(0, 0, width(), height());
  glOrtho(0, width(), 0, height(), -1, 1);

  glMatrixMode(GL_MODELVIEW);
  glScissor(0, 0, width(), height());
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glClearColor(0.0, 0.0, 0.0, 1.0);
  glLoadIdentity();

  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  for (uint32_t i = 0; i < 6; ++i) {
    data_[i].vertex_.x_ += 0.1;
    data_[i].vertex_.y_ += 0.1;
  }

  if (!renderer_2d_.modify_vertex_data(data_, 0)) {
    throw std::runtime_error("ERROR: Data Modification Error");
  }

  renderer_2d_.draw_vertex_data();
  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  swapBuffers();
}
4

1 に答える 1

2

実際のソリューション

OP とのチャットに時間を費やしてコードを調べたところ、問題は彼の OpenGL データ初期化コードへの冗長な呼び出しであることがわかりました。QGLWidget::initializeGLOP は、OpenGL コンテキストが使用可能になるとすぐに Qt によって暗黙的に呼び出される仮想メソッドを提供する Qt の QGLWidgetを使用します。そのメソッドをオーバーライドすることで、VBO などの永続的な OpenGL オブジェクトを信頼できる方法で初期化できます。

ただし、OP のコードでは、このメソッドも明示的に呼び出されたため、クライアント側の頂点データの std::vector バッファーに頂点データの別の完全なコピーがプッシュされ、後で変更されず、明らかな「残留」データが発生しました。

コードを適切な QGLWidget セマンティクスの形状に戻すことで、問題が解決しました。

元の回答

描画する前にフレームバッファをクリアしていないため、以前に描画されたものはすべて、オーバードローする「背景」になります。OpenGL はシーングラフではなく、描画 API です。VBO のデータを変更しても、画面の内容が「魔法のように」更新されることはありません。

于 2013-04-27T09:10:40.393 に答える