我有一个关于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];
}
答案 0 :(得分:2)
我知道这个问题是在不久前被问到的,但我认为无论如何我都会为了别人的利益而回答这个问题。没有什么比遇到Stack Overflow上的问题更糟糕的了,这个问题正好描述了你的问题,但没有答案; - )
我认为BinaryStar在这里已经触头。您的问题是您没有有效的GL上下文可供使用。
当系统调用drawInCGLContext:pixelFormat:forLayerTime:displayTime:
时,它会为您提供准备好供代码使用的上下文。例如,将在此上下文中设置当前视口,以便您绘制到图层bounds
中。在您调用自定义代码时,您无法保证此上下文已正确设置或甚至是当前上下文。
我认为这里的正确方法是将CAOpenGLLayer
的异步属性设置为NO
。然后从您的按钮处理代码中调用图层上的setNeedsDisplay
。