【发布时间】:2013-10-29 15:24:33
【问题描述】:
我对 FrameBuffers 有点困惑。
目前,为了在屏幕上绘图,我使用此代码为GL_COLOR_ATTACHMENT0 生成一个带有 Renderbuffer 的帧缓冲区。
-(void)initializeBuffers{
//Build the main FrameBuffer
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
//Build the color Buffer
glGenRenderbuffers(1, &colorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);
//setup the color buffer with the EAGLLayer (it automatically defines width and height of the buffer)
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &bufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &bufferHeight);
//Attach the colorbuffer to the framebuffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);
//Check the Framebuffer status
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
NSAssert(status == GL_FRAMEBUFFER_COMPLETE, ERROR_FRAMEBUFFER_FAIL);
}
我使用
显示缓冲区内容[context presentRenderbuffer:GL_RENDERBUFFER];
阅读this question,我看到Arttu Peltonen的评论说:
默认帧缓冲区是您默认渲染到的位置,您没有 做任何事情来获得它。帧缓冲对象是你可以做的 改为渲染,这被某些人称为“屏幕外渲染”。 如果你这样做,你最终会得到纹理而不是纹理的图像 默认帧缓冲区(显示在屏幕上)。你可以复制 从该纹理到默认帧缓冲区(屏幕上)的图像,即 通常使用 blitting 完成(但它仅在 OpenGL ES 3.0 中可用)。 但如果你只想在屏幕上显示图像,你可能 一开始就不会使用 FBO。
所以我想知道我的方法是否只是用于离屏渲染。 在这种情况下,我必须做什么才能在默认缓冲区上渲染?! (注意,我不想使用 GLKView...)
【问题讨论】: