CCClippingnode导致OpenGL错误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 错误0x0502 -[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 测试实现中......

最新更新