Я застревал в течение многих часов, пытаясь представить Базовое дерево Слоя анимации в контексте OpenGL с помощью CARenderer. Контекст OpenGL в настоящее время обеспечивается подклассом NSOpenGLView, настроенным в Интерфейсном Разработчике с настройками на значении по умолчанию.
Вот то, как я настроил CALayers в своем примере:
l1 = [[CALayer layer] retain]; // l1 is an instance variable
l1.bounds = CGRectMake(0, 0, 100, 100);
l1.backgroundColor = CGColorCreateGenericRGB(1, 1, 0, 1);
CALayer* l2 = [CALayer layer];
l2.bounds = CGRectMake(0, 0, 20, 20);
l2.backgroundColor = CGColorCreateGenericRGB(1, 0, 0, 1);
l2.position = CGPointMake(50, 50);
[l1 addSublayer:l2];
Если я добавляю их к регулярному NSView, они обнаруживаются очень хорошо.
Вот код для прорисовки от моего подкласса NSOpenGLView:
- (void) drawRect:(NSRect)dirtyRect
{
NSRect frame = [self frame];
// set up context according to CARenderer.h instructions
glViewport(0, 0, frame.size.width, frame.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, frame.size.width, 0, frame.size.height, -1, 1);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
if (l1)
{
CARenderer* renderer = [CARenderer rendererWithCGLContext:[[self openGLContext] CGLContextObj] options:nil];
renderer.layer = l1;
renderer.bounds = NSRectToCGRect(frame);
[renderer beginFrameAtTime:0.0 timeStamp:NULL];
[renderer addUpdateRect:renderer.bounds];
[renderer render];
[renderer endFrame];
}
glFlush();
}
Я проверил, что представление перерисовывается после того, как слои были созданы, и само представление, кажется, работает хорошо - команды OpenGL, я выпускаю шоу правильно. CARenderer действительно оживает (на самом деле, если l1 уже будет присоединен к другому контексту в то время этот код выполнения, то он будет покорно жаловаться). Нет только никакого видимого вывода, никогда.
Другие вещи я попробовал: обертывание CARenderer кодирует в CATransaction, игре с опциями настройки NSOpenGLView в Интерфейсном Разработчике, рендеринг целого дела во вручную созданный контекст OpenGL вне экрана и сохранение что в файл изображения... все к тому же эффекту: собственное прекрасное шоу команд OpenGL, CARenderer ничего не показывает.
Я подозреваю, что существует что-то не так со способом, которым мой контекст OpenGL настраивается, или что я мог бы даже так или иначе представлять за пределами своей области просмотра..., вероятно, некоторую действительно глупую незначительную деталь. К сожалению, и документация и пример кода для CARenderer в сети несколько редки, и в то время как я справедливо испытан с Базовой Анимацией, мое знание OpenGL решительно ограничено.
Таким образом, прямо сейчас я серьезно озадачен и полностью из идей, таким образом, любые указатели значительно ценятся!
Удачи