iOS5 是不是同时支持 GL_STENCIL_INDEX 和 GL_STENCIL_INDEX8?
Posted
技术标签:
【中文标题】iOS5 是不是同时支持 GL_STENCIL_INDEX 和 GL_STENCIL_INDEX8?【英文标题】:Does iOS5 support both GL_STENCIL_INDEX and GL_STENCIL_INDEX8?iOS5 是否同时支持 GL_STENCIL_INDEX 和 GL_STENCIL_INDEX8? 【发布时间】:2011-11-16 10:15:10 【问题描述】:使用以下代码:
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
的值时,GL_STENCIL_INDEX8
得到了正确的值 (8),但 GL_STENCIL_INDEX
得到了 0。
有了这个,我就无法获得一个带有模板缓冲区的功能完整的 FBO。是因为GL_STENCIL_INDEX
吗?这里应该使用哪一个?
【问题讨论】:
【参考方案1】:似乎在 OpenGL ES 2.0 中至少在 ios 上(不确定其他操作系统)您必须创建组合深度缓冲区和模板缓冲区。 我列出了我的设备(带有 iOS 5.0.1 的 iPhone 4)上支持的所有扩展,唯一与模板缓冲区相关的是:
GL_OES_packed_depth_stencil
这表明您必须创建一个组合深度+模板缓冲区(取自 iPhone 3D Programming 一书)
// 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);
【讨论】:
我之前尝试过相同的示例代码,但是当我使用 OpenGL ES 2 时,我删除了所有 _OES 后缀...但是因为打包的深度/模板缓冲区是一个扩展,我应该有保留一个用于 GL_DEPTH24_STENCIL8_OES。这就是这样工作的。感谢 JimN,不感谢 Apple... 从 Apple 的文档“OpenGL ES Programming Guide for iOS”中的“Platform Notes”部分和“PowerVR SGX 的发行说明和最佳实践”标题下,我们读到:“在 iOS 4.0 和更高版本中, 不支持单独的模板缓冲区。使用组合的深度/模板缓冲区。”。我不知道这是否也适用于 PowerVR MBX,但由于从 Xcode 4.5 开始不再支持 iPhone 3G,所以这是一个有争议的问题。以上是关于iOS5 是不是同时支持 GL_STENCIL_INDEX 和 GL_STENCIL_INDEX8?的主要内容,如果未能解决你的问题,请参考以下文章