glmatrixMode (GL_Projection) 호출은 왜 iPhone 앱에서 exc_bad_access를 제공합니까?

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

  •  06-07-2019
  •  | 
  •  

문제

AppDidFinishLaunching 에서이 세 가지 기능을 호출하는 iPhone 앱이 있습니다.

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

디버거를 밟을 때 첫 번째 줄을 실행할 때 EXC BAD 액세스가 발생합니다. 왜 이런 일이 일어나고 있는지 아이디어가 있습니까?

BTW 나는 같은 일을하는 다른 응용 프로그램이 있으며 잘 작동합니다. 그래서 나는 해당 앱의 모든 것을 복제하려고 노력했지만 (#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 드로잉을하고있는 이유는 무엇입니까? View 또는 View 컨트롤러가 UIAPplicationDelegate보다 OpenGL 호출에 더 적절한 장소가되지 않습니까?

다른 팁

버그를 제출 한 날짜를 감안할 때 문제가 될 가능성은 거의 없지만 Apple 예제 코드를 사용하고 ES 2.0 능력 장치에서 실행되면 사양에서 매트릭스 스택을 제거하면 이와 같은 내용이 표시됩니다. 장치가 ES 1.1을 지원하기 때문에 함수 정의는 컴파일러에 표시되지만 컴파일러에 표시됩니다.

나는 많은 다른 상황 에서이 오류를 보았지만 구체적으로는 당신 에게서는 결코 없었습니다. 일반적으로 응용 프로그램이 이미 출시 된 메모리에 액세스하려고 시도한 결과로 나타납니다.

ERT가 여전히 할당되었음을 확인할 수 있습니까?

Glorthof를 호출하기 전에 현재 행렬을 ID 매트릭스로 교체해야합니다. 이것은 glloadidentity ()로 수행 할 수 있습니다.

iPhone 시뮬레이터를 다시 시작하십시오. 이 문제는 분명히 OpenGL 컨텍스트가 제대로 설정되지 않기 때문입니다. iPhone 시뮬레이터에 문제가 있으며 [EAGLCONTEXT SETCURRENTCONTEXT :]에 의해 OpenGL 컨텍스트가 올바르게 설정되도록 다시 시작해야한다는 것을 알았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top