2013-09-25 80 views
0

我在使用ios處理離屏渲染時遇到問題。以下是設置幀緩衝區對象和關聯緩衝區的代碼。它與蘋果在其開發者中心的代碼基本相同。ios上的framebuffer對象渲染

glGenFramebuffers(1, &pick_id); 
glBindFramebuffer(GL_FRAMEBUFFER, pick_id); 

GLuint color_id, depth_id; 
glGenRenderbuffers(1, &color_id); 
glBindRenderbuffer(GL_RENDERBUFFER, color_id); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, screen_width, screen_height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_id); 

glGenRenderbuffers(1, &depth_id); 
glBindRenderbuffer(GL_RENDERBUFFER, depth_id); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, screen_width, screen_height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_id); 

std::cout << pick_id << " " << color_id << " " << depth_id << std::endl; 

switch(glCheckFramebufferStatus(GL_FRAMEBUFFER)) 
{ 
    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: std::cout << "framebuffer incomplete attachment" << std::endl; break; 
    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: std::cout << "framebuffer incomplete missing attachment" << std::endl; break; 
    case GL_FRAMEBUFFER_UNSUPPORTED: std::cout << "framebuffer unsupported" << std::endl; break; 
    case GL_FRAMEBUFFER_COMPLETE: std::cout << "framebuffer complete" << std::endl; break; 
} 

glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

glFinish(); 

GLubyte pix[] = {0, 0, 0}; 
glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pix); 

std::cout << (int)pix[0] << " " << (int)pix[1] << " " << (int)pix[2] << std::endl; 

當它運行時,它打印出'framebuffer complete',所以我假設framebuffer對象已經正確設置。但我期望調用glReadPixels可以讓我恢復我設置的清晰顏色(紅色) - 而不是返回黑色。

有什麼我在這裏失蹤?我試圖讓屏幕上的渲染工作在我的應用程序中拾取對象。

回答

0

我認爲你必須添加

glReadBuffer(GL_COLOR_ATTACHMENT0);

之前的glReadPixels。但如果這不起作用,我就沒有想法了。

0

看來是上面的代碼是正確的。唯一的問題是,在iOS上你需要使用GL_RGBA作爲glreadpixels的參數,GL_RGB不起作用。