Android上的CCClippingNode无法正常工作

时间:2015-01-04 16:18:34

标签: android spritebuilder cocos2d-iphone-3 cocos2d-swift

我最近开始了一个新的iOS项目。我也想支持Android,所以我选择SpriteBuilder和最新的cocos2d-iphone(cocos2d-swift)。

我使用CCClippingNode剪辑内容。它需要24位深度缓冲区和8位模板缓冲区,所以我需要将以下行添加到AppDelegate.m到应用程序: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中的以下行返回0:

glGetIntegerv(GL_STENCIL_BITS, &_stencilBits);

在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

1 个答案:

答案 0 :(得分:1)

我发现问题出在哪里,所以我会回答我自己的问题:)

整个问题在于误导日志。我们需要修改平台/ 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值时才需要进行其他更改。