2008-11-04 24 views
5

Tôi có một ứng dụng iphone mà tôi gọi là ba chức năng trong appDidFinishLaunching:Tại sao gọi glMatrixMode (GL_PROJECTION) cho tôi EXC_BAD_ACCESS trong một ứng dụng iPhone?

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

Khi bước qua với trình gỡ lỗi tôi nhận được EXC TRUY CẬP BAD khi tôi thực hiện dòng đầu tiên. Có ý kiến ​​giải thích tại sao điều này lại xảy ra không?

Btw Tôi có một ứng dụng khác mà tôi làm điều tương tự và nó hoạt động tốt. Vì vậy, tôi đã cố gắng để lặp lại tất cả mọi thứ trong ứng dụng đó (#imports, thêm khung OpenGLES, vv) nhưng bây giờ tôi chỉ bị mắc kẹt.

Trả lời

4

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?

+0

Có thể là do ứng dụng demo của Apple, CrashLanding thực hiện theo cách đó. – xyz

2

Tôi đã nhìn thấy lỗi này trong nhiều tình huống khác nhau nhưng không bao giờ cụ thể trong trường hợp của bạn. Nó thường xuất hiện như là kết quả của ứng dụng đang cố truy cập bộ nhớ đã được phát hành.

Bạn có thể xác nhận rằng rect vẫn được cấp phát không?

1

Bạn cần thay thế ma trận hiện tại bằng ma trận nhận dạng trước khi gọi glOrthof. Điều này có thể được thực hiện với glLoadIdentity()

3

Không có khả năng là ngày bạn gửi lỗi, nhưng bạn cũng sẽ thấy một cái gì đó như thế này nếu bạn sử dụng mã ví dụ của Apple và chạy trên ES 2.0 thiết bị, vì nó loại bỏ ngăn xếp ma trận khỏi spec, mặc dù các định nghĩa chức năng sẽ vẫn hiển thị với trình biên dịch vì thiết bị cũng hỗ trợ ES 1.1.

+0

Dự án OpenGL mặc định cố gắng tải ES 2.0 trước tiên và chỉ 1.1 nếu điều đó không thành công. Bạn có thể sửa lỗi này bằng cách chỉnh sửa 'awakeFromNib'. – tsellon

1

Khởi động lại Trình mô phỏng iPhone. Vấn đề này chắc chắn là do bối cảnh OpenGL không được thiết lập đúng cách. Tôi thấy rằng đôi khi iPhone Simulator có vấn đề và cần phải được khởi động lại cho bối cảnh OpenGL để có được thiết lập đúng bởi [EAGLContext setCurrentContext:].

+3

Tôi cũng nhận được lỗi này và không thể hiểu tại sao. Tôi tìm thấy trang này thông qua google. Sau đó, tôi đã xem xét kỹ hơn mã của tôi và nhận ra rằng tôi đã khởi tạo ngữ cảnh với ES 2.0, nhưng sử dụng trình renderer ES 1.1 của tôi để hiển thị. Rất tiếc. – Christine

Các vấn đề liên quan