我正在尝试在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;
关于我做错了什么的建议阻止了我的几何图形的绘制?
答案 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(请参阅支持的扩展名),但如果要确定,可以在实际设备上验证扩展名列表。