为什么调用glMatrixMode(GL_PROJECTION)在iPhone应用程序中给我EXC_BAD_ACCESS?

StackOverflow https://stackoverflow.com/questions/260391

  •  06-07-2019
  •  | 
  •  

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

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

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

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

有帮助吗?

解决方案

如果两个线程试图同时绘制到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绘图?对于OpenGL调用,视图或视图控制器不是比UIApplicationDelegate更适合的地方吗?

其他提示

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

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

你能确认还是分配了吗?

在调用glOrthof之前,需要使用单位矩阵替换当前矩阵。这可以使用glLoadIdentity()

来完成

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top