5

我有一个 iphone 应用程序,我在 appDidFinishLaunching 中调用这三个函数:

glMatrixMode(GL_PROJECTION);
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);

当我使用调试器单步执行时,我在执行第一行时得到 EXC BAD ACCESS。任何想法为什么会发生这种情况?

顺便说一句,我有另一个应用程序,我做同样的事情,它工作正常。因此,我尝试复制该应用程序中的所有内容(#imports、添加 OpenGLES 框架等),但现在我被卡住了。

4

5 回答 5

4

如果两个线程试图一次绘制到 OpenGL 场景,我会在 OpenGL 调用中遇到这种情况。但是,这听起来不像你在做什么。

在此调用之前,您是否正确初始化了显示上下文和帧缓冲区?例如,在进行 OpenGL 绘图的 UIView 子类中,我在其 initWithCoder: 方法中调用以下内容:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) 
{
    [self release];
    return nil;
}

createFramebuffer 方法如下所示:

- (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;
}

这几乎是样板代码,由 XCode 中的 OpenGL ES 应用程序模板生成。也许在调用 glMatrixMode() 之前没有初始化事物,你会崩溃。

另外,为什么要在 applicationDidFinishLaunching: 中进行 OpenGL 绘图?视图或视图控制器不是比 UIApplicationDelegate 更适合 OpenGL 调用的地方吗?

于 2008-11-05T17:42:19.593 回答
3

考虑到您提交错误的日期,这不太可能是问题,但如果您使用 Apple 示例代码并在支持 ES 2.0 的设备上运行,您也会看到类似的内容,因为它从规范中删除了矩阵堆栈,尽管由于该设备还支持 ES 1.1,因此编译器仍然可以看到函数定义。

于 2010-02-04T19:08:00.573 回答
2

我在许多不同的情况下都看到过这个错误,但从来没有在你的情况下特别出现过。它通常是由于应用程序试图访问已释放的内存而出现的。

你能确认 rect 仍然被分配吗?

于 2008-11-04T16:07:43.187 回答
1

在调用 glOrthof 之前,您需要将当前矩阵替换为单位矩阵。这可以通过 glLoadIdentity() 来完成

于 2009-02-20T03:50:02.980 回答
1

重新启动 iPhone 模拟器。此问题肯定是由于未正确设置 OpenGL 上下文。我发现有时 iPhone 模拟器会出现问题,需要重新启动 OpenGL 上下文才能通过 [EAGLContext setCurrentContext:] 正确设置。

于 2010-05-23T18:56:27.590 回答