2011-11-19 13 views
0

我有一個問題,我想支持ios5的項目。我有一個應用程序的代碼,包含使用opengl-es的3d渲染和使用多采樣幀緩衝區的抗鋸齒。該代碼在ios4.3上運行良好。由於ios5三維模型不會被渲染。在模擬器上,我只是得到一個粉紅色的屏幕。解決multisample frambuffer錯誤,因爲ios5

一些測試後,我發現,該功能

glResolveMultisampleFramebufferAPPLE() 

的問題。該功能引發錯誤。 0x502

NSLog(@"0x%x", glGetError()); // "0x502" 

我不知道發生了什麼,爲什麼這個函數不能在ios5上工作。可以請任何人幫助我嗎?這是一些創建幀緩衝區的代碼。

//first destroy frame buffers 
glDeleteFramebuffersOES(1, &viewFramebuffer); 
viewFramebuffer = 0; 
glDeleteRenderbuffersOES(1, &viewRenderbuffer); 
viewRenderbuffer = 0; 

if(depthRenderbuffer) 
{ 
    glDeleteRenderbuffersOES(1, &depthRenderbuffer); 
    depthRenderbuffer = 0; 
} 

// Generate IDs for a framebuffer object and a color renderbuffer 
glGenFramebuffersOES(1, &viewFramebuffer); 
glGenRenderbuffersOES(1, &viewRenderbuffer); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
// This call associates the storage for the current render buffer with the EAGLDrawable (our CAEAGLLayer) 
// allowing us to draw into a buffer that will later be rendered to screen whereever the layer is (which corresponds with our view). 
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer]; 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

//Width and height der viewBoundingBox in Pixeln 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

//Generate our MSAA Frame and Render buffers 
glGenFramebuffersOES(1, &msaaFramebuffer); 
glGenRenderbuffersOES(1, &msaaRenderBuffer); 

//Bind our MSAA buffers 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderBuffer); 

// Generate the msaaDepthBuffer. 
// 4 will be the number of pixels that the MSAA buffer will use in order to make one pixel on the render buffer. 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4,GL_RGB565_OES, backingWidth, backingHeight); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, msaaRenderBuffer); 
glGenRenderbuffersOES(1, &msaaDepthBuffer); 

//Bind the msaa depth buffer. 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaDepthBuffer); 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT16_OES, backingWidth , backingHeight); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, msaaDepthBuffer); 



// Make sure that you are drawing to the current context 
[EAGLContext setCurrentContext:context]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFramebuffer); 
[controller drawView:self];         

//Bind both MSAA and View FrameBuffers 
glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer); 

if((err = glGetError())) NSLog(@"%x error in line %u in method %s", err, __LINE__, __FUNCTION__); 

// Call a resolve to combine both buffers 
glResolveMultisampleFramebufferAPPLE(); 

if((err = glGetError())) NSLog(@"%x error in line %u in method %s", err, __LINE__, __FUNCTION__); 

// Use discard to improve fill rate and overall performance! 
GLenum attachments[] = {GL_DEPTH_ATTACHMENT_OES, GL_COLOR_ATTACHMENT0_OES, GL_STENCIL_ATTACHMENT_OES}; 
glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 3, attachments); 

// Present final image to screen 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

回答

1

對我來說,這個問題是由格式傳遞給glRenderbufferStorageMultisampleAPPLE造成的。

嘗試使用GL_RGBA8_OESGL_RGB5_A1_OES代替。