我在使用glDrawRangeElements()
时遇到了一些问题。基本上,我将给定模型中的每个网格都保留在相同的顶点/索引缓冲区中,并使用glDrawRangeElements()
选择性地绘制它们(如果需要,可以在每次绘制之间更改 Material 等)。
这是我用来在模型内绘制网格的函数:
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是最后一个索引。这些值是在导入网格(使用asimp)时确定的:
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导入的场景中的每个网格都将运行此代码。
我遇到的问题是,即使subMesh [0]和subMesh [1]包含不同的值,drawMesh(0)和drawMesh(1)也会绘制相同的内容(具体来说,subMesh [0]的开始= 0,结束= 35,subMesh [1]的开始= 36,结束= 71)。如果我使用
glDrawElements()
一次绘制整个网格,它会正确绘制两个子网格,因此我知道顶点和索引数据是正确的。我究竟做错了什么?
(PS。我使用的是OpenGL 3.3,核心配置文件)
最佳答案
您没有正确使用此功能:
glDrawRangeElements(prim, start, end, (end - start) + 1, iformat, NULL);
glDrawRangeElements()
的第二个和第三个参数是而不是,用于指定索引数组的子范围。它们是要提前告知GL在该绘制调用期间将使用哪些顶点索引,因此它们是在顶点数组中指定一个子范围。您应该仅通过count
和indices
参数指定要呈现的索引数组部分。您可以简单地使用
glDrawElements(prim, (end - start) + 1, iformat, (GLvoid*) (sizeof(yourElementType)*start) );
如果要使用
glDrawRangeElements()
,则应该另外跟踪每个对象使用的顶点数组的范围。关于c++ - glDrawRangeElements遇到的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23398625/