2011-09-03 131 views

回答

2

像素缓冲区是OpenGL的平台特定扩展。在ES中,没有这样的扩展,因为帧缓冲区对象是核心API的一部分。帧缓冲区对象可用于完成离屏渲染,通常用于纹理,然后用于渲染管道内的其他任务。这就是在OpenGL ES中如何实现深度缓冲区阴影和延迟渲染等效果。

例如,要生成链接到你已经在其他地方所产生的纹理颜色和深度缓冲的帧缓冲区对象,你可以做:

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

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colourTextureID, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTextureID, 0); 

if((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    // there was some sort of problem 
} 

你会使用glBindFramebuffer到帧缓冲结合以后。如果你想渲染实际看到的东西,你应该重新绑定链接到显示器的帧缓冲区。您将在某处使用EAGLContext -renderbufferStorage:fromDrawable:创建一个帧缓冲区对象,该对象使用CAEAGLLayer作为颜色缓冲区的存储区。

链接到帧缓冲区的每个单独事物(例如颜色缓冲区的存储或深度缓冲区的存储)称为渲染缓冲区。您可以要求驱动程序在不考虑通过glGenRenderbuffersglRenderbufferStorage连接到质感的任何区域内构建它们。因此,例如,如果您喜欢,您可以将颜色缓冲区放在纹理中,让GPU根据深度缓冲区自己计算出存储空间。

+1

好的答案,但不要忘记在附加代码示例中的纹理之前绑定framebuffer。 –

+0

哦,是的,否则你会干扰当前绑定的任何帧缓冲区。我会修复我的代码。 – Tommy