本文介绍了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.

With GL_STENCIL_INDEX, I get the GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT error. With GL_STENCIL_INDEX8, I get the GL_FRAMEBUFFER_UNSUPPORTED error. Both are caused by the last glFramebufferRenderbuffer() function, which should bind the stencil buffer to the FBO.

此外,当我检查GL_RENDERBUFFER_STENCIL_SIZE值时,使用GL_STENCIL_INDEX8可以得到正确的值(8),但是使用GL_STENCIL_INDEX可以得到0.

Furthermore, when I check the GL_RENDERBUFFER_STENCIL_SIZE value, I get the right value (8) with GL_STENCIL_INDEX8, but I get 0 with GL_STENCIL_INDEX.

有了这个,我无法获得带有模板缓冲区的功能齐全的FBO.是由于GL_STENCIL_INDEX吗?在这里应该使用哪一个?

With this, I can't get a functional and complete FBO with a stencil buffer. Is it due to the GL_STENCIL_INDEX? Which one should be used here?

推荐答案

似乎在OpenGL ES 2.0中,至少在iOS上(不确定其他OS),您必须结合使用深度缓冲区和模板缓冲区.我列出了我的设备(带有iOS 5.0.1的iPhone 4)上支持的所有扩展,并且与模板缓冲区有关的唯一扩展是:

It seems that in OpenGL ES 2.0 at least on iOS (not sure for other OS) you have to create combine the depth buffer and the stencil buffer.I listed all the extensions supported on my device (iPhone 4 with iOS 5.0.1) and the only one related to the stencil buffer is :

GL_OES_packed_depth_stencil

这表明您必须创建一个组合深度+模板缓冲区(摘自iPhone 3D编程书)

This suggests that you would have to create a combo depth+stencil buffer (taken from the iPhone 3D Programming book)

// 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);

这篇关于iOS5是否同时支持GL_STENCIL_INDEX和GL_STENCIL_INDEX8?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-17 21:59
查看更多