【问题标题】:Unexpected triangles rendered with OpenGL使用 OpenGL 渲染的意外三角形
【发布时间】:2017-05-13 23:21:02
【问题描述】:

我想渲染搅拌机的默认立方体和 Suzanne。我将它们都导出为 OBJ 文件。加载和渲染工作正常,但是当我尝试在同一个场景中渲染它们时,事情变得混乱(对我来说)。

“相关”代码在第 48 到 56 行。

  1. 一开始只有 model1(第 51 行,Suzanne 或立方体或其他任何东西),场景按预期渲染。

  2. 然后我添加了另一个 model2(第 54 行),它恰好是立方体。 意外的三角形(参见渲染场景,屏幕截图 (I))绘制在立方体的顶部,此时尚未翻译为“离开”。

  3. 不知道我何时将立方体移到后面的计划或想法,但惊讶地发现垃圾三角形留在原地。 因为我不知道它们是从哪里来的,所以我开始翻转线来动手:

    • 先渲染 model1 还是先渲染 model2 并不重要。
    • 当我加载两个 default_cubes 而不是一个 suzanne 时,一个立方体非常好,另一个就像第一个屏幕截图中一样。

结果见截图 (II)。我在 model1 之前构建 model2 并且垃圾现在在不同的地方以不同的方式呈现。

下面的代码显示了模型构造函数的最后一部分,其中配置了 VBA。 render() 函数是在屏幕截图中看到的函数。

   [...]
   glGenVertexArrays( 1, &VBA );
   glBindVertexArray( VBA );

   glGenBuffers( 1, &VBO[0] );
   glBindBuffer( GL_ARRAY_BUFFER, VBO[0] );
   glBufferData( GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), vertices.data(), GL_STATIC_DRAW );
   glEnableVertexAttribArray( 0 );
   glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
}


void Model::render( void )
{
  glUniformMatrix4fv( model_location, 1, GL_FALSE, &model_matrix[0][0] );
  glBindVertexArray( VBA );
  // 'vertices' is of type std::vector<glm::vec3>
  glDrawArrays( GL_TRIANGLES, 0, sizeof(glm::vec3) * vertices.size() );
}

【问题讨论】:

  • 请将代码添加为代码块而不是图像。

标签: c++ opengl vbo vao


【解决方案1】:

您将错误的数据传递给glDrawArrays。第三个参数必须包含顶点数,而不是字节大小。正确的调用是:

glDrawArrays( GL_TRIANGLES, 0, vertices.size() );

【讨论】:

  • 就这么简单。非常感谢。我的希望成真了。我感到很惭愧。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多