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

时间:2010-12-10 22:35:01

标签: objective-c ipad opengl-es objective-c++

我正在尝试在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);

顶点定义为:

vector<float> vertices;

并且每个faceArray定义为:

vector<UInt32> faceArray;

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

1 个答案:

答案 0 :(得分:7)

股票OpenGL ES不支持GL_UNSIGNED_INT索引。

来自GLES glDrawElements man page

  

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

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

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

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