连续调用glDrawElements

时间:2016-08-19 12:51:07

标签: c++ opengl-es glsl

我正在尝试绘制具有多个纹理的网格物体。为此,我基于纹理将模型分成子模型。

以下是代码和说明:

  • 按行RenderCommon和SetProjectViewModel函数
  • 设置渲染程序
  • 渲染公共仅初始化缓冲区(如果尚未初始化)。

     RenderCommon(object);
     SetProjectViewModel(m_basicProgramHandle, object, cam);
    
  • 通过循环for循环

    收集网格及其子网格
    std::vector<Mesh*> meshes;
    meshes.push_back(object->m_mesh.get());
    for (int i = 0; i < (int)object->m_mesh->m_subMeshes.size(); i++)
      meshes.push_back(object->m_mesh->m_subMeshes[i]);
    
  • 比之前的代码是使用glDrawElements绘制每个子网格

      for (auto mesh : meshes)
      {
        GLuint offset = 0;
        glEnableVertexAttribArray(0); // Vertex
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, object->m_mesh-  >GetVertexSize(), 0);
    
        offset += 3 * sizeof(float);
        glEnableVertexAttribArray(1); // Normal
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
    
        offset += 3 * sizeof(float);
        glEnableVertexAttribArray(2); // Texture
        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
    
        glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId);
    
        RenderState rs = mesh->m_material->m_renderState;
        glBindTexture(GL_TEXTURE_2D, rs.m_diffuseTexture);
    
        if (mesh->m_indexCount != 0)
        {
          glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->m_vboIndexId);
          glDrawElements(GL_TRIANGLES, mesh->m_indexCount, GL_UNSIGNED_INT, nullptr);
        }
        else
        {
          glDrawArrays(GL_TRIANGLES, 0, mesh->m_vertexCount);
        } 
    

让我们说它的6个面有一个立方体和两个纹理。 1面上的纹理为1,其他纹理上有0。如果我只绘制一个项目,请使用此设置。没关系。但是,如果for循环绘制2个项目,我只看到具有两个不同纹理的正面和背面。而不是6个面孔。这是每个对象都是绘制但部分绘制。

我检查缓冲区和纹理ID一百次!他们是对的。如果我逐个绘制每个缓冲区而不是它们。但是,如果我连续绘制它们而不是它们部分出现。

1 个答案:

答案 0 :(得分:0)

似乎

glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId);

必须出现在任何休假代码之前

glEnableVertexAttribArray(0); // Vertex
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), 0);