Tôi đã thực hiện điều này với các cuộc gọi OpenGL nếu hai chuỗi đang cố gắng vẽ đến cảnh OpenGL cùng một lúc. Tuy nhiên, điều đó không giống như những gì bạn đang làm.
Bạn đã khởi tạo đúng ngữ cảnh hiển thị và bộ đệm khung trước cuộc gọi này chưa? Ví dụ, trong phân lớp UIView của tôi mà không vẽ OpenGL, tôi gọi như sau trong initWithCoder của nó: Phương pháp:
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer])
{
[self release];
return nil;
}
Phương pháp createFramebuffer trông giống như sau:
- (BOOL)createFramebuffer
{
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
if (USE_DEPTH_BUFFER) {
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
return NO;
}
return YES;
}
là khá nhiều mã boilerplate này , như được tạo bởi mẫu ứng dụng OpenGL ES trong XCode. Có lẽ bằng cách không khởi tạo mọi thứ trước khi gọi glMatrixMode(), bạn đang gặp sự cố.
Ngoài ra, tại sao bạn làm bản vẽ OpenGL trong ứng dụngDidFinishLaunching :? Bộ điều khiển chế độ xem hoặc chế độ xem có phù hợp với các cuộc gọi OpenGL hơn UIApplicationDelegate của bạn không?
Có thể là do ứng dụng demo của Apple, CrashLanding thực hiện theo cách đó. – xyz