0

我必须粘贴的代码太多了。但是,当我尝试自己实现它们时,我遵循了教程,似乎没有任何效果。我将在下面粘贴glMapBuffer例程。请注意vertex_typerender_target是模板参数,允许用户自己设置这些枚举值。

正在发生的事情的图像是。

通过修改 VBO 的内容,Wich 显示正方形缓慢地线性平移到屏幕的右上角。

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 数据初始化代码的冗余调用。OP 使用 Qt 的 QGLWidget,它提供了一个虚拟方法QGLWidget::initializeGL,一旦 OpenGL 上下文准备好使用,Qt 就会隐式调用该方法。通过覆盖该方法,可以以可靠的方式初始化持久的 OpenGL 对象,如 VBO 等。

然而,在 OP 的代码中,此方法也被显式调用,因此顶点数据的客户端 std::vector 缓冲区被推送了顶点数据的另一个完整副本,随后没有修改,导致明显的“剩余”数据。

将代码带回正确的 QGLWidget 语义形状解决了这个问题。

原始答案

您没有在绘制之前清除帧缓冲区,因此之前绘制的任何内容都会成为您透支的“背景”。OpenGL不是一个场景图,它是一个绘图 API。如果您更改 VBO 中的数据,它不会“神奇地”更新屏幕内容。

于 2013-04-27T09:10:40.393 回答