【问题标题】:consecutive calls to glDrawElements连续调用 glDrawElements
【发布时间】:2016-08-19 12:51:07
【问题描述】:

我正在尝试绘制具有多个纹理的网格。为此,我根据纹理将模型分离为子模型。

这里是代码和解释:

  • 通过 RenderCommon 和 SetProjectViewModel 函数设置渲染程序
  • Render common 仅在缓冲区尚未初始化时才初始化它们。

     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 一百次!他们是正确的。如果我一个一个地绘制每个缓冲区,那么它们也可以。但如果我连续绘制它们,它们就会部分出现。

【问题讨论】:

    标签: c++ opengl-es glsl


    【解决方案1】:

    好像

    glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId);
    

    必须出现在任何闲置代码之前

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多