CARenderer никогда не производит вывод

Я застревал в течение многих часов, пытаясь представить Базовое дерево Слоя анимации в контексте 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 решительно ограничено.

Таким образом, прямо сейчас я серьезно озадачен и полностью из идей, таким образом, любые указатели значительно ценятся!

Удачи

5
задан ig2r 7 August 2010 в 09:36
поделиться