1

我最近开始了一个新的 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 中的以下行返回 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

4

1 回答 1

1

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

整个问题出在误导性的日志中。我们需要修改函数setupView:Platforms/Android/CCGLView.mCCGLView 在调用eglChooseConfig之前记录 EGL 值, eglChooseConfig将深度和模板大小设置为 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 值时,才需要进行其他更改。

于 2015-01-09T12:20:34.257 回答