我正在使用Cocos3D加载3D骨架模型(从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 文件?
附带说明一下,当我在"对象模式"下打开 skeleton.blend 文件时,我在 Blender 的右上角看到 205,407 个顶点。但是,当我从"对象模式"更改为"编辑模式"并选择所有顶点时,只有 33,574 + 4,773 = 38,347 个顶点存在。 为什么"对象模式"显示的顶点比"编辑模式"多?
如果你对一定程度的设备/平台依赖性感到满意,那么大多数合理的最新设备都支持 OES_element_index_uint 扩展。这增加了对 GL_UNSIGNED_INT
类型的索引的支持,以及基本 ES 2.0 支持的GL_UNSIGNED_SHORT
和GL_UNSIGNED_BYTE
类型。
在您似乎正在使用的iOS上,所有SGX Series 5,A7和A8 GPU都支持此扩展(来源:https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html)。我希望对此扩展的支持也出现在类似年龄的Android设备上。
使用 32 位索引时,内存将在索引范围耗尽之前很久就耗尽。
如果你想让它与纯ES 2.0功能一起工作,你几乎必须将你的模型分成更小的部分。至少我想不出一个合理的选择。