如何将glDrawElements与GL_UNSIGNED_INT一起用于索引?

Dav*_*ido 7 opengl-es objective-c objective-c++ ipad

我正在尝试在iPad上绘制超过65536个顶点的3d对象,但无法弄清楚我做错了什么.我使用GL_UNSIGNED_SHORT的原始模型运行得很好,但现在使用GL_UNSIGNED_INT,我无法使用glDrawElements命令显示任何内容.这就像渲染器完全忽略了我的glDrawElements线.我正在引用的渲染循环部分如下:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);
glNormalPointer(GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);

for (int i = 0; i < assemblyObj->numObjects; i++)
{
     glDrawElements(GL_TRIANGLES, assemblyObj->partList[i].faceArray.size(), GL_UNSIGNED_INT, &assemblyObj->partList[i].faceArray[0]);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
Run Code Online (Sandbox Code Playgroud)

顶点定义为:

vector<float> vertices;
Run Code Online (Sandbox Code Playgroud)

每个faceArray定义为:

vector<UInt32> faceArray;
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的任何建议都阻止了我的几何图形的绘制?

Bah*_*bar 9

股票OpenGL ES不支持GL_UNSIGNED_INT指数.

GLES glDrawElements手册页:

如果type不是GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT,则生成GL_INVALID_ENUM.

当支持GL_OES_element_index_uint时,将放宽此限制.

如果您没有目标平台的支持,最好的办法是将网格划分为多个子网格,< 64K每个子网格都有索引.

至于ipad,据我所知,iOS不支持此扩展(请参阅支持的扩展),但如果要确定,可以在实际设备上验证扩展名列表.

  • 这个答案是不正确的,如果实现了'GL_OES_element_index_uint`,那么`glDrawElements`支持`GL_UNSIGNED_INT`(根据<OpenGLES/ES2/glext.h>,它在iOS中). (3认同)