ios上的帧缓冲区对象渲染

Posted

技术标签:

【中文标题】ios上的帧缓冲区对象渲染【英文标题】:framebuffer object rendering on ios 【发布时间】:2013-09-25 13:49:49 【问题描述】:

我在 ios 上进行屏幕外渲染时遇到问题。下面是设置帧缓冲区对象和相关缓冲区的代码。它与苹果开发者中心的代码基本相同。

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;

运行时它会打印出“帧缓冲区完成”,因此我假设帧缓冲区对象已正确设置。但我希望对 glReadPixels 的调用能够返回我设置的清晰颜色(红色)——而不是返回黑色。

这里有什么我遗漏的吗?我正在尝试让屏幕外渲染工作以在我的应用中拾取对象。

【问题讨论】:

【参考方案1】:

我认为你必须添加

glReadBuffer(GL_COLOR_ATTACHMENT0);

在 glReadPixels 之前。但如果这不起作用,我就没主意了。

【讨论】:

【参考方案2】:

看来上面的代码是正确的。唯一的问题是在 ios 上你需要使用 GL_RGBA 作为 glreadpixels 的参数,GL_RGB 不起作用。

【讨论】:

以上是关于ios上的帧缓冲区对象渲染的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

我是不是需要将渲染缓冲区附加到已经附加了纹理的帧缓冲区?

将模板渲染缓冲区绑定到opengl中的帧缓冲区

通过帧缓冲区对象渲染到纹理

无法将简单的帧缓冲区渲染到四边形并显示

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作