如何在OpenGL ES 2.0中使用模板缓冲区创建FBO?

时间:2010-04-12 09:37:20

标签: iphone opengl-es

我需要3GS上的模板缓冲区来渲染平面阴影和多边形 偏移不会完美,仍然有z-fighting问题。所以我用 模板缓冲区使阴影正确,它适用于win32 gles2 模拟器,但不是在iPhone上。之后我向整体添加了一个帖子效果 现场。即使在win32 gles2模拟器上,模板缓冲区也不起作用。

我试图将模板缓冲区附加到FBO,屏幕转向 黑色。这是我的代码,

   glGenRenderbuffers(1, &dbo); // depth buffer
   glBindRenderbuffer(GL_RENDERBUFFER, dbo);
   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES,
widthGL, heightGL);

   glGenRenderbuffers(1, &sbo); // stencil buffer
   glBindRenderbuffer(GL_RENDERBUFFER, sbo);
   glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, widthGL,
heightGL);

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

   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex, 0);
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, dbo);
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, sbo); // this make the whole screen black.

使用STENCIL_SIZE = 8创建eglContext,它在没有RTT的情况下工作。

我尝试更改深度缓冲区和。的RenderbufferStorage 模板缓冲区,但它们都不起作用。

我有什么遗漏的吗?模板缓冲包是否包含 深度缓冲? (我找不到GL_DEPTH24_STENCIL8 ......)

2 个答案:

答案 0 :(得分:14)

在iOS上的OpenGL ES 2.0中,您必须使用GL_DEPTH24_STENCIL8_OES创建组合深度和模板渲染缓冲区,然后将其作为GL_DEPTH_ATTACHMENT和GL_STENCIL_ATTACHMENT附加到绑定的帧缓冲区。

glGenRenderbuffers(1, &depthStencilRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);

答案 1 :(得分:3)

请注意,如果您使用的是GLKView,它就像

一样简单

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

其中视图为:GLKView*