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 в журнале по какой-то другой причине.

Другие вопросы по тегам