iOS5是否同时支持GL_STENCIL_INDEX和GL_STENCIL_INDEX8? [英] Does iOS5 support both GL_STENCIL_INDEX and GL_STENCIL_INDEX8?

查看:644
本文介绍了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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆