У меня есть общий вопрос о том, как CAOpenGLLayer
работает в Mac OS X. Можно ли нарисовать в OpenGL в месте, отличном от -[CAOpenGLLayer drawInCGLContext:]
метода CAOpenGLLayer
?
Я использую пример кода Apple CALayerEssentials и только что переместил код, который рисует прямоугольник, с drawInCGLContext
на redrawGLContent
.Метод redrawGLContent
вызывается каждый раз, когда пользователь нажимает кнопку в окне OpenGL.
Когда код рисования находится в 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];
}