我最近开始了一个新的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

最佳答案

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

整个问题在于误导性日志。我们需要在Platforms / Android / CCGLView.m中修改功能setupView:。 CCGLView在调用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值时,才需要进行其他更改。

07-28 01:55
查看更多