Android 上的 CCClippingNode 不工作
CCClippingNode on Android not working
我最近开始了一个新的 iOS 项目。我也想支持 Android 所以我选择了带有最新 cocos2d-iphone (cocos2d-swift) 的 SpriteBuilder。
我使用 CCClippingNode 来裁剪内容。它需要 24 位深度缓冲区和 8 位模板缓冲区,所以我需要将以下行添加到 AppDelegate.m 到 application:didFinishLaunchingWithOptions:
[cocos2dSetup setObject:@GL_DEPTH24_STENCIL8_OES forKey:CCSetupDepthFormat];
自然这只适用于 iOS。
根据日志,它应该适用于 Android 而无需任何其他代码,因为它在启动时记录以下行:
EGL_DEPTH_SIZE = 24
EGL_STENCIL_SIZE = 8
稍后当我在代码中创建 CCClippingNode 时,它记录:
[CCClippingNode initWithStencil:]_block_invoke : Stencil buffer is not enabled; enable it by passing GL_DEPTH24_STENCIL8_OES into the depthFormat parrameter when initializing CCGLView. Until then, everything will be drawn without stencil.
发生这种情况是因为 CCClippingNode.m returns 0 中的以下行:
glGetIntegerv(GL_STENCIL_BITS, &_stencilBits);
On iOS GL_STENCIL_BITS 为 8(将 CCSetupDepthFormat 设置为 GL_DEPTH24_STENCIL8_OES 后)。
在 Android 上是 0。
我应该怎么做才能让它在 Android 上也能正常工作?
我使用的是 SpriteBuilder 1.4.0-beta.3 和 Cocos2D-Swift 版本 3.4.1-develop
我发现问题出在哪里了,所以我会回答我自己的问题:)
整个问题都出在误导性日志中。我们需要在Platforms/Android/CCGLView.m中修改函数setupView:。 CCGLView 在调用 eglChooseConfig 之前记录 EGL 值,后者将深度和模板大小设置为 0。
移动线
logConfig(_eglDisplay, _eglConfiguration);
之后
eglChooseConfig(_eglDisplay, configAttribs, &_eglConfiguration, 1, &numConfigs)
将显示真实值。通过此修改,以下行将出现在日志中:
EGL_DEPTH_SIZE = 0
EGL_STENCIL_SIZE = 0
所以我们在日志中有真实的值,我们需要的只是设置它们。这可以通过将以下两行添加到结构 configAttribs[]
中来完成(在函数 setupView:)
的最开始
EGL_DEPTH_SIZE, 24,
EGL_STENCIL_SIZE, 8,
CCClippingNode 也突然开始剪辑 Android 上的内容
注意:只有 configAttribs[]
结构需要通过上述两行进行增强。仅当您出于某些其他原因需要日志中的真实 EGL 值时才需要进行其他更改。
我最近开始了一个新的 iOS 项目。我也想支持 Android 所以我选择了带有最新 cocos2d-iphone (cocos2d-swift) 的 SpriteBuilder。
我使用 CCClippingNode 来裁剪内容。它需要 24 位深度缓冲区和 8 位模板缓冲区,所以我需要将以下行添加到 AppDelegate.m 到 application:didFinishLaunchingWithOptions:
[cocos2dSetup setObject:@GL_DEPTH24_STENCIL8_OES forKey:CCSetupDepthFormat];
自然这只适用于 iOS。 根据日志,它应该适用于 Android 而无需任何其他代码,因为它在启动时记录以下行:
EGL_DEPTH_SIZE = 24
EGL_STENCIL_SIZE = 8
稍后当我在代码中创建 CCClippingNode 时,它记录:
[CCClippingNode initWithStencil:]_block_invoke : Stencil buffer is not enabled; enable it by passing GL_DEPTH24_STENCIL8_OES into the depthFormat parrameter when initializing CCGLView. Until then, everything will be drawn without stencil.
发生这种情况是因为 CCClippingNode.m returns 0 中的以下行:
glGetIntegerv(GL_STENCIL_BITS, &_stencilBits);
On iOS GL_STENCIL_BITS 为 8(将 CCSetupDepthFormat 设置为 GL_DEPTH24_STENCIL8_OES 后)。 在 Android 上是 0。
我应该怎么做才能让它在 Android 上也能正常工作?
我使用的是 SpriteBuilder 1.4.0-beta.3 和 Cocos2D-Swift 版本 3.4.1-develop
我发现问题出在哪里了,所以我会回答我自己的问题:)
整个问题都出在误导性日志中。我们需要在Platforms/Android/CCGLView.m中修改函数setupView:。 CCGLView 在调用 eglChooseConfig 之前记录 EGL 值,后者将深度和模板大小设置为 0。
移动线
logConfig(_eglDisplay, _eglConfiguration);
之后
eglChooseConfig(_eglDisplay, configAttribs, &_eglConfiguration, 1, &numConfigs)
将显示真实值。通过此修改,以下行将出现在日志中:
EGL_DEPTH_SIZE = 0
EGL_STENCIL_SIZE = 0
所以我们在日志中有真实的值,我们需要的只是设置它们。这可以通过将以下两行添加到结构 configAttribs[]
中来完成(在函数 setupView:)
EGL_DEPTH_SIZE, 24,
EGL_STENCIL_SIZE, 8,
CCClippingNode 也突然开始剪辑 Android 上的内容
注意:只有 configAttribs[]
结构需要通过上述两行进行增强。仅当您出于某些其他原因需要日志中的真实 EGL 值时才需要进行其他更改。