CCClippingNode на Android не работает
Я недавно начал новый проект iOS. Я хотел бы также поддерживать Android, поэтому я выбрал SpriteBuilder с новейшим cocos2d-iphone (cocos2d-swift).
Я использую CCClippingNode для отсечения содержимого. Ему нужен 24-битный буфер глубины и 8-битный буфер трафарета, поэтому мне нужно было добавить следующую строку в AppDelegate.m в приложение: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-development
1 ответ
Я выяснил, где была проблема, поэтому я отвечу на свой вопрос:)
Вся проблема была в вводящих в заблуждение журналах. Нам нужно изменить функцию setupView: в Platforms / Android / CCGLView.m. CCGLView регистрирует значения 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 в журнале по какой-то другой причине.