使用OpenGL渲染的意外三角形

时间:2016-12-29 15:51:44

标签: c++ opengl vbo vao

我想渲染blender的默认立方体和Suzanne。我把它们都导出为OBJ文件。加载和渲染工作正常,但当我尝试在同一场景中渲染它们时,事情变得令人困惑(对我而言)。

"相关"代码在第48到56行。

(I) Screenshot: code + rendered scene

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

  2. 然后我添加了另一个 model2 (第54行),它恰好是多维数据集。 非预期的三角形(参见渲染的场景,截图(I)),其中绘制在立方体的顶部,未被翻译和#34;远离#34;在这一点上。

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

    • 首先呈现 model1 或model2 是不重要的。
    • 当我加载两个default_cubes而不是一个suzanne时,一个立方体完全没问题,而另一个立方体就像第一个截图一样。
  4. 结果见于Screenshot(II)。我在 model1 之前构建 model2 ,现在垃圾在不同的地方以不同方式呈现。

    (II) Screenshot: code + rendered scene

    下面的代码显示了模型构造函数的最后一部分,其中配置了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() );
    }
    

1 个答案:

答案 0 :(得分:4)

您将错误的数据传递给glDrawArrays。第三个参数必须包含顶点数,而不是以字节为单位的大小。正确的电话会是:

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