Как я могу смешаться между моим UIView и EAGLView?
Вопрос
У меня есть рендеринг сцены opengl на слое EAGLView и некоторые другие элементы (круги и т. д.) на UIView (который является родственным EAGLView, расположенным над ним). Можно ли смешивать цвета между двумя слоями? Я хотел бы сделать смешивание различий, чтобы получить эффект инверсии цветов в EAGLView. Р>
Я играл с CGBlendMode, но это, похоже, влияет только на то, что я рисую в этом текущем представлении. Я думаю, что это как-то связано с CGContext, но я немного запутан в деталях. Могу ли я заставить UIView и EAGLView иметь один и тот же CGContext, чтобы смешивание работало между ними?
Помощь, исправления, уточнения приветствуются. Заранее спасибо, -S р>
Решение
Краткий ответ: нельзя. Длинный ответ следует.
Под EAGLView
вы должны понимать подкласс UIView
, который включен в шаблон OpenGL ES в Xcode. Что делает этот класс особенным, так это то, что метод класса layerClass
переопределяется и возвращает класс CAEAGLLayer
вместо класса CALayer
, как по умолчанию. р>
UIView
и CALayer
работают в парах. Все объекты UIView
поддерживаются CALayer
, CALayer
является объектом, отвечающим за макет и отображение на экране. UIView
является делегатом CALayer
и отвечает за отрисовку графики при необходимости.
CALayer
позволит своему делегату ( UIView
) рисовать в CGContextRef
. Это один контекст для UIView
, поэтому вы не можете использовать CGBlendMode
для смешивания нескольких представлений, поскольку он будет функционировать только в одном контексте UIView.
Смешивание CALayer
должно выполняться с использованием свойств фильтра. Они определены для iPhone OS, но доступны фильтры undefined в соответствии с документацией. Это связано с тем, что в настоящее время Core Image недоступно в iPhone OS.
Другие советы
Я не думаю, что вы сможете смешивать цвета в этом смысле. Лучшее, что вы можете сделать, это сделать один полностью скрывающим другой или иметь полупрозрачный верхний слой (в этом случае вы увидите часть внизу) - но вы не сможете рисовать XOR-тип. р>