c++ - 我在使用 glDrawRangeElements 时遇到的问题

标签 c++ opengl assimp

我在使用 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 是最后一个索引。这些值是在导入网格时确定的(使用 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,核心配置文件)

最佳答案

你没有正确使用这个函数:

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

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

你可以简单地使用

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

如果您想使用 glDrawRangeElements(),您还应该跟踪每个对象使用的顶点数组的范围。

关于c++ - 我在使用 glDrawRangeElements 时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23398625/

相关文章:

c++ - 在内存网格上应用 Assimp 后处理

java - JAssimp - 找不到依赖库

c++ - 表达式模板 - C++ 模板 : The Complete Guide

c++ - Linux 上的 SDL OpenGL 新手,这有什么问题?

c++ - 为什么用这个 OpenGL 上下文创建的窗口会以透明方式打开?

java - Opengl 对象翻译

c++ - 使用assimp库时visual studio中未解析的外部符号

c++ - qt 等待信号/事件,GUI

.net - BeginPaint 的 hWnd 参数值是否正确?

c++ - 我在给定程序中哪里错了?