我正在尝试绘制具有多个纹理的网格物体。为此,我基于纹理将模型分成子模型。
以下是代码和说明:
渲染公共仅初始化缓冲区(如果尚未初始化)。
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一百次!他们是对的。如果我逐个绘制每个缓冲区而不是它们。但是,如果我连续绘制它们而不是它们部分出现。
答案 0 :(得分:0)
似乎
glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId);
必须出现在任何休假代码之前
glEnableVertexAttribArray(0); // Vertex glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), 0);