顶点超过 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_SHORT
和 GL_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 功能一起工作,你几乎必须将你的模型分成更小的部分。至少我想不出一个合理的选择。
我正在使用 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_SHORT
和 GL_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 功能一起工作,你几乎必须将你的模型分成更小的部分。至少我想不出一个合理的选择。