2011-11-16 125 views
1

用下面的代码:iOS5是否同时支持GL_STENCIL_INDEX和GL_STENCIL_INDEX8?

GLuint viewRenderbuffer, viewFramebuffer, viewDepthbuffer, stencilBuffer; 
// Create the framebuffer object 
glGenFramebuffers(1, &viewFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 

// Create a render buffer and bind it to the FBO. 
glGenRenderbuffers(1, &viewRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &imageWidth); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &imageHeight); 

// Create a depth buffer and bind it to the FBO. 
glGenRenderbuffers(1, &viewDepthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, viewDepthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, imageWidth, imageHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, viewDepthbuffer); 

// Create a stencil buffer to crop the rendered scene and bind it to the FBO. 
glGenRenderbuffers(1, &stencilBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, stencilBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX, imageWidth, imageHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilBuffer); 

// Check the FBO. 
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"Failure with framebuffer generation: %d", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
} 

随着GL_STENCIL_INDEX,我得到的GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误。用GL_STENCIL_INDEX8,我得到了GL_FRAMEBUFFER_UNSUPPORTED错误。两者都是由最后一个glFramebufferRenderbuffer()函数引起的,该函数应该将模板缓冲区绑定到FBO。

此外,当我检查GL_RENDERBUFFER_STENCIL_SIZE值时,我得到正确的值(8)与GL_STENCIL_INDEX8,但我得到0与GL_STENCIL_INDEX

有了这个,我无法使用模板缓冲区获得功能完整的FBO。是否由于GL_STENCIL_INDEX?哪一个应该用在这里?

回答

3

看来,在OpenGL ES 2.0中,至少在iOS上(不确定是否需要其他操作系统),您必须创建深度缓冲区和模板缓冲区。 我列出了支持我的设备上(iPhone 4的iOS 5.0.1)所有的扩展和相关模板缓存中只有一个是:

GL_OES_packed_depth_stencil

这表明,你需要创建一个组合深度+模板缓存(从iPhone 3D编程的书拍摄)

// Create a packed depth stencil buffer. 
GLuint depthStencil; 
glGenRenderbuffersOES(1, &depthStencil); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencil); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, width, height); 

// Create the framebuffer object. 
GLuint framebuffer; 
glGenFramebuffersOES(1, &framebuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, 
          GL_RENDERBUFFER_OES, color); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, 
           GL_RENDERBUFFER_OES, depthStencil); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, 
          GL_RENDERBUFFER_OES, depthStencil); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, color); 
+0

我曾尝试早些时候,相同的示例代码,但通过我与OpenGL ES的2上班,我删除了所有的_OES后缀......但随着打包深度/模板缓冲区是一个扩展,我应该保留GL_DEP的缓冲区TH24_STENCIL8_OES。这样的工作。感谢JimN,并且不要感谢苹果公司...... –

+1

在“平台注释”一节以及“PowerVR SGX发行说明和最佳实践”标题下的Apple文档“适用于iOS的OpenGL ES编程指南”中,我们阅读:“在iOS 4.0及更高版本中,不支持单独的模板缓冲区,请使用组合的深度/模板缓冲区。“我不知道这是否也适用于PowerVR MBX,但由于Xcode 4.5不再支持iPhone 3G,因此这是一个有争议的问题。 – bleater