我在使用glDrawRangeElements时遇到的问题

Problems I'm having with glDrawRangeElements

本文关键字:遇到 问题 glDrawRangeElements      更新时间:2023-10-16

我的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]的起点为0,终点为35,subMesh[1]的起点为36,终点为71(。如果我使用glDrawElements()一次绘制整个网格,它会正确地绘制两个子网格,因此我知道顶点和索引数据是正确的。

我做错了什么?

(PS。我使用OpenGL 3.3,核心配置文件(

您没有正确使用此函数:

glDrawRangeElements(prim, start, end, (end - start) + 1, iformat, NULL);

glDrawRangeElements()的第二个和第三个参数是而不是,用于指定索引数组的子范围。他们会提前告诉GL在绘图调用期间将使用哪些顶点索引,因此他们会在的顶点数组中指定一个子范围。您应该仅通过countindices参数指定要渲染的索引数组部分。

你可以简单地使用

glDrawElements(prim, (end - start) + 1, iformat, (GLvoid*) (sizeof(yourElementType)*start) );

如果要使用glDrawRangeElements(),则应额外跟踪每个对象使用的顶点数组的范围。