使用 OpenGL 渲染的意外三角形

Unexpected triangles rendered with OpenGL

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

"relevant" 代码在第 48 到 56 行。

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

  2. 然后又加了一个model2(第54行),刚好是立方体。 绘制在立方体顶部的意外三角形(参见渲染场景,屏幕截图 (I)),此时未翻译 "away"。

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

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

结果见截图(二)。我在 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() );
}

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

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