我遇到了一些问题glDrawRangeElements()
。基本上,我将给定模型中的每个网格都保存在同一个顶点/索引缓冲区中,并用于glDrawRangeElements()
有选择地绘制它们(如果必须在每次绘制之间更改材质等)。
这是我用来在模型中绘制网格的函数:
void Mesh::drawMesh(uint index)
{
if (index >= subMesh.size()) return;
va.drawRange(subMesh[index].start, subMesh[index].end);
}
在哪里va.drawRange()
:
void VertexArray::drawRange(unsigned int start, unsigned int end)
{
if (ready == false)
return;
/* Bind our vertex array */
bindArray();
/* Draw it's contents */
if (ibo == 0)
glDrawArrays(prim, start, (end - start) + 1);
else
glDrawRangeElements(prim, start, end, (end - start) + 1, iformat, NULL);
unbindArray();
}
subMesh[i].start 是子网格的第一个索引。subMesh[i].end 是最后一个索引。这些值是在导入网格时确定的(使用 assimp):
subMesh[i].start = (uint)indices.size();
for (uint j = 0; j < mesh->mNumFaces; ++j)
{
aiFace& face = mesh->mFaces[j];
indices.push_back(face.mIndices[0] + vertexOffset);
indices.push_back(face.mIndices[1] + vertexOffset);
indices.push_back(face.mIndices[2] + vertexOffset);
}
subMesh[i].end = (uint)indices.size() -1;
vertexOffset += mesh->mNumVertices;
此代码针对场景中 assimp 导入的每个网格运行。
我遇到的问题是 drawMesh(0) 和 drawMesh(1) 绘制相同的东西,即使 subMesh[0] 和 subMesh[1] 包含不同的值(具体来说, subMesh[0] 有 start = 0 和 end = 35,subMesh[1] 的 start = 36 和 end = 71)。如果我一次绘制整个网格,使用glDrawElements()
,它会正确绘制两个子网格,所以我知道顶点和索引数据是正确的。
我究竟做错了什么?
(PS。我使用的是 OpenGL 3.3,核心配置文件)