【问题标题】:Vertices exceeded max allowed by OpenGL ES顶点超过 OpenGL ES 允许的最大值
【发布时间】:2015-05-20 04:18:32
【问题描述】:

我正在使用 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 文件?

附带说明,当我在“对象模式”中打开 skeleton.blend 文件时,我在 Blender 的右上角看到 205,407 个顶点。但是,当我从“对象模式”更改为“编辑模式”并选择所有顶点时,只存在 33,574 + 4,773 = 38,347 个顶点。为什么“对象模式”显示的顶点比“编辑模式”多?

【问题讨论】:

    标签: opengl-es-2.0 blender cocos3d


    【解决方案1】:

    如果您对一定程度的设备/平台依赖性感到满意,那么大多数合理的最新设备都支持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 功能一起使用,您几乎必须将模型拆分为更小的部分。至少我想不出一个合理的替代方案。

    【讨论】:

    • 谢谢。我通过应用 The Decimate 工具来减少顶点,从而采用了不同的解决方案。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2014-09-02
    • 2013-09-14
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多