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