2012-06-28 35 views
7

Tôi đang gặp sự cố khi tạo FBO và sau đó sử dụng làm kết cấu trong ứng dụng iOS của mình. Tôi đã tải lên một phiên bản rút gọn của ứng dụng của tôi trên github, trong đó cho thấy vấn đề. Tôi chỉ nhận được một màn hình trống với một màu lạ mà tôi chưa từng đặt. Kiểm tra trạng thái cho thấy rằng FBO đã được tạo thành công.Ví dụ tối thiểu để tạo FBO bằng OpenGL ES 2.0 trên iOS

https://github.com/glman74/simpleFBO

tôi đã xem xét câu hỏi stackoverflow có liên quan, và đặc biệt là liên kết dưới đây từ datenwolf trong đó cho thấy làm thế nào để thiết lập một FBO sử dụng dư thừa, nhưng không sử dụng bóng đổ. Tôi vẫn không chắc mình đang làm gì sai.

https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/

Tôi cũng phụ thêm ở đây các phần có liên quan của mã. Trong phương thức renderFBO, tôi chỉ làm rõ ràng. Tôi đã có thể mong đợi rằng kết cấu màu (màu xanh) rắn này sẽ được sử dụng khi tôi vẽ đa giác trong render chính.

FBO thiết lập:

// intialize FBO 
- (void)setupFBO 
{ 
    fbo_width = 512; 
    fbo_height = 512; 

    glGenFramebuffers(1, &fboHandle); 
    glGenTextures(1, &fboTex); 
    glGenRenderbuffers(1, &depthBuffer); 

    glBindFramebuffer(GL_FRAMEBUFFER, fboHandle); 

    glBindTexture(GL_TEXTURE_2D, fboTex); 
    glTexImage2D(GL_TEXTURE_2D, 
       0, 
       GL_RGBA, 
       fbo_width, fbo_height, 
       0, 
       GL_RGBA, 
       GL_UNSIGNED_BYTE, 
       NULL); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0); 

    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, fbo_width, fbo_height); 
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 

    // FBO status check 
    GLenum status; 
    status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    switch(status) { 
     case GL_FRAMEBUFFER_COMPLETE: 
      NSLog(@"fbo complete"); 
      break; 

     case GL_FRAMEBUFFER_UNSUPPORTED: 
      NSLog(@"fbo unsupported"); 
      break; 

     default: 
      /* programming error; will fail on all hardware */ 
      NSLog(@"Framebuffer Error"); 
      break; 
    } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

FBO render:

// render FBO 
- (void)renderFBO 
{ 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glEnable(GL_TEXTURE_2D); 
    glBindFramebuffer(GL_FRAMEBUFFER, fboHandle); 

    glViewport(0,0, fbo_width, fbo_height); 
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

chính Render:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    // render FBO tex 
    [self renderFBO]; 

    glViewport(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
    // render main 
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_TEXTURE_2D); 
    glActiveTexture(GL_TEXTURE0); 

    glUniform1i(uSamplerLoc, 0);  
    // Render 
    glUseProgram(_program); 

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glDisable(GL_TEXTURE_2D); 
} 

Một ý tưởng về những gì tôi có thể làm sai?

Chỉnh sửa # 1:

Tôi đã thực hiện một số thay đổi nhỏ đối với mã của mình tại github. Đã thử sử dụng GL_FRAMEBUFFER thay vì GL_DRAW_FRAMEBUFFER_APPLE ở trên. Cũng đã thêm một cuộc gọi kết cấu ràng buộc, đó là mất tích. Vẫn không hoạt động.

Chỉnh sửa # 2:

Tôi đã tìm được giải pháp. Tôi cần gọi để hiển thị chính:

// reset to main framebuffer 
[((GLKView *) self.view) bindDrawable];  

Trả lời

9

Tìm thấy giải pháp và tôi đã cập nhật mã bên dưới trong trường hợp nó hữu ích cho ai đó.

https://github.com/glman74/simpleFBO/

Vấn đề chính là rằng tôi cần phải gọi chính render:

// reset to main framebuffer 
[((GLKView *) self.view) bindDrawable]; 

Đây là bởi vì tôi đã sử dụng GLKView. Tình huống khác với các ví dụ của CAEAGLLayer.

+1

Cảm ơn, ví dụ của bạn thực sự đã giúp tôi. Nếu ai đó có lỗi biên dịch với GL_DEPTH_COMPONENT24_OES, hãy thay thế bằng GL_DEPTH_COMPONENT16 – LightMan

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