使用CAOpenGLLayer在OpenGL中渲染

时间:2010-11-05 17:22:57

标签: macos opengl

我有一个关于CAOpenGLLayer在Mac OS X中的工作原理的一般性问题。是否可以在-[CAOpenGLLayer drawInCGLContext:] CAOpenGLLayer方法之外的地方绘制 OpenGL {1}}?

我正在使用Apple的示例代码CALayerEssentials 并且只是将从drawInCGLContext绘制矩形的代码移动到redrawGLContent。每次用户单击OpenGL窗口上的按钮时,都会调用redrawGLContent方法 当绘图代码在drawInCGLContext中时,它会按预期绘制,但是当我在redrawGLContent下移动代码时,不会向OpenGL窗口绘制任何内容。我试图了解它是如何工作的。

-(IBAction)redrawGLContent:(id)sender
{

// This part wass added, but does not draw the rectangle

    float timeInterval=0;
    GLfloat rotate = timeInterval * 60.0; // 60 degrees per second!
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glRotatef(rotate, 0.0, 0.0, 1.0);
    glBegin(GL_QUADS);
        glColor3f(1.0, 0.0, 0.0);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5,  0.5);
        glVertex2f( 0.5,  0.5);
        glVertex2f( 0.5, -0.5);
    glEnd();
    glPopMatrix();
// up to here

    // Just tell the layer to display itself and it will redraw
    [hostCAOpenGLLayer.layer setNeedsDisplay];
}

-(void)drawInCGLContext:(CGLContextObj)glContext pixelFormat:(CGLPixelFormatObj)pixelFormat forLayerTime:(CFTimeInterval)timeInterval displayTime:(const CVTimeStamp *)timeStamp
{

    // Set the current context to the one given to us.
    CGLSetCurrentContext(glContext);


/* This part was removed.  When code is here the quad is displayed 

    GLfloat rotate = timeInterval * 60.0; // 60 degrees per second!
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glRotatef(rotate, 0.0, 0.0, 1.0);
    glBegin(GL_QUADS);
        glColor3f(1.0, 0.0, 0.0);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5,  0.5);
        glVertex2f( 0.5,  0.5);
        glVertex2f( 0.5, -0.5);
    glEnd();
    glPopMatrix();
*/    
    // Call super to finalize the drawing. By default all it does is call glFlush().
    [super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:timeInterval displayTime:timeStamp];
}

1 个答案:

答案 0 :(得分:2)

我知道这个问题是在不久前被问到的,但我认为无论如何我都会为了别人的利益而回答这个问题。没有什么比遇到Stack Overflow上的问题更糟糕的了,这个问题正好描述了你的问题,但没有答案; - )

我认为BinaryStar在这里已经触头。您的问题是您没有有效的GL上下文可供使用。

当系统调用drawInCGLContext:pixelFormat:forLayerTime:displayTime:时,它会为您提供准备好供代码使用的上下文。例如,将在此上下文中设置当前视口,以便您绘制到图层bounds中。在您调用自定义代码时,您无法保证此上下文已正确设置或甚至是当前上下文。

我认为这里的正确方法是将CAOpenGLLayer的异步属性设置为NO。然后从您的按钮处理代码中调用图层上的setNeedsDisplay