顶点超过 OpenGL ES 允许的最大值

Vertices exceeded max allowed by OpenGL ES

我正在使用 Cocos3D 加载 3D Skeleton model (exported from Blender) 但得到以下断言:

*** Assertion failure in -[CC3OpenGLES2IOS drawIndicies:ofLength:andType:as:], /Users/phamdacloc/Downloads/xxx/cocos3d201/Projects/CC3HelloWorld/cocos3d/cocos3d/OpenGL/CC3OpenGL.m:282

这是断言的来源:

-(void) drawIndicies: (GLvoid*) indicies ofLength: (GLuint) len andType: (GLenum) type as: (GLenum) drawMode {
#if CC3_OGLES
    CC3Assert((type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_BYTE),
              @"OpenGL ES permits drawing a maximum of 65536 indexed vertices, and supports only"
              @" GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE types for vertex indices");
#endif
    glDrawElements(drawMode, len, type, indicies);
    LogGLErrorTrace(@"glDrawElements(%@, %u, %@, %p)", NSStringFromGLEnum(drawMode), len, NSStringFromGLEnum(type), indicies);
    CC_INCREMENT_GL_DRAWS(1);
}

根据上面的消息,我的理解是模型过于详细并且包含的​​顶点数超过了允许的数量 (65536)。然后我移除了所有的脊髓、头部、腿部,这次 Cocos3D 加载成功。有没有办法保留所有这些顶点,或者我应该将模型分成几个 .pod 文件?

附带说明一下,当我打开 "Object Mode" 中的 skeleton.blend 文件时,我在 Blender 的右上角看到了 205,407 个顶点。但是,当我将所有顶点从 "Object Mode" 更改为 "Edit Mode" 和 select 时,只存在 33,574 + 4,773 = 38,347 个顶点。为什么 "Object Mode" 比 "Edit Mode" 显示更多的顶点?

如果您可以接受一定程度的 device/platform 依赖,大多数最新的设备都支持 OES_element_index_uint 扩展。这在基础 ES 2.0 支持的类型 GL_UNSIGNED_SHORTGL_UNSIGNED_BYTE 类型之上增加了对类型 GL_UNSIGNED_INT 的索引的支持。

在您似乎正在使用的 iOS 上,所有 SGX 系列 5、A7 和 A8 GPU 都支持此扩展(来源:https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html)。我希望 Android 类似年龄的设备也支持此扩展。

使用 32 位索引,您的内存将 运行 在您用尽索引范围之前很长时间。

如果你想让它与纯 ES 2.0 功能一起工作,你几乎必须将你的模型分成更小的部分。至少我想不出一个合理的选择。