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», но в остальном узел отсечения делает то, что он должен делать в симуляторе. Любые идеи о том, что вызывает ошибку и что я могу сделать, чтобы исправить это?


person pdmorrill    schedule 29.04.2015    source источник
comment
Если вы оставите alphaThreshold в покое (по умолчанию 1), ошибка должна исчезнуть (хотя вы, как и я, можете не захотеть оставлять порог равным 1). CCClippingNode применяет другой шейдер ко всем узлам, используемым в качестве трафарета. Кажется, это связано с проблемой, но я еще не выяснил, почему именно возникает ошибка.   -  person Raginmari    schedule 22.05.2015
comment
Вы пытались проанализировать кадр OpenGL в навигаторе отладки в Xcode? Он может предоставить более подробные сообщения об ошибках. Вы также можете перейти к CCSprite, строка 530 и добавить пару CHECK_GL_ERROR, чтобы узнать, какая строка вызывает проблему.   -  person Raginmari    schedule 22.05.2015


Ответы (1)


Я использую два вложенных CCClippingNodes, у обоих alphaThreshold установлено значение ‹ 1. Наблюдаемая ошибка возникает один раз за кадр. Об этом сообщается (!) в строке 530 из CCSprite, но встречается в CCClippingNode в строке 285:

[program setUniformLocation:alphaValueLocation withF1:_alphaThreshold];

Если alphaThreshold меньше 1, CCClippingNode назначает шейдер альфа-теста всем своим узлам трафарета. Когда он обновляет юниформу порога альфа-канала в приведенной выше строке, он делает это без вызова glUseProgram до этого, поэтому реализация пытается установить юниформу, которая может отсутствовать в привязанном в данный момент шейдере.

Добавьте следующую строку перед приведенной выше строкой в ​​CCClippingNode, чтобы связать программу шейдера до того, как будет установлен его юниформ. Это должно избавиться от ошибки.

[program use];

CCClippingNode кажется немного грубоватым по краям, по крайней мере, реализация альфа-теста...

person Raginmari    schedule 22.05.2015
comment
Без альфа-порога, равного 0, CCClippingNode обрезал ограничивающую рамку спрайта, а не там, где у него была альфа. К счастью, ваше решение сработало отлично. Спасибо! - person pdmorrill; 27.05.2015