CCClippingnode 导致 OpenGL 错误 0x0502

CCClippingnode causes OpenGL error 0x0502

我正在使用 cocos2d-iPhone v.2.2,更新旧游戏,并且我有一个导致错误的剪辑节点。在 AppDelegate.m 中,我将设置切换为使用 CCClippingNode:

CCGLView *glView = [CCGLView viewWithFrame:[window_ bounds]
                               pixelFormat:kEAGLColorFormatRGB565
                               depthFormat:GL_DEPTH24_STENCIL8_OES //switched from 0
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

然后我用这段代码在我的 mainGame.m

中制作了剪辑器
//after interface
@property (nonatomic, strong) CCClippingNode *shadowClipper;

//in the init method
CCSprite *stencil = [CCSprite spriteWithSpriteFrameName:@"clipper.png"];
stencil.position = ccp(winSize.width/2, winSize.height/2);
_shadowClipper = [CCClippingNode clippingNodeWithStencil:stencil];
_shadowClipper.alphaThreshold = 0.0;
[_gameLayer addChild:_shadowClipper z:2];

控制台记录 "OpenGL error 0x0502 in -[CCSprite draw] 530" 但除此之外,剪辑节点正在执行它在模拟器中应该执行的操作。关于导致错误的原因以及我可以做些什么来修复它有什么想法吗?

我正在使用两个嵌套的 CCClippingNodes,它们都将 alphaThreshold 设置为 < 1。观察到的错误每帧发生一次。它在 CCSprite 的第 530 行中报告 (!) 但出现在第 285 行的 CCClippingNode 中:

[program setUniformLocation:alphaValueLocation withF1:_alphaThreshold];

如果 alphaThreshold 小于 1,CCClippingNode 会为其所有模板节点分配一个 alpha 测试着色器。当它在上面的行中更新 alpha 阈值统一时,它没有调用 glUseProgram

CCClippingNode中的上一行之前添加以下行,以便在设置统一之前绑定着色器程序。这应该可以消除错误。

[program use];

CCClippingNode 边缘似乎有点粗糙,至少 alpha 测试实现...