如何在OpenGL ES 2.0中使用模板缓冲区创建FBO? [英] How to create a FBO with stencil buffer in OpenGL ES 2.0?
问题描述
我需要在3GS上使用模板缓冲来渲染平面阴影,并且多边形
偏移将不起作用,仍然存在z-fighting问题。所以我使用
模板缓冲区来使阴影正确,它适用于win32 gles2
模拟器,但不适用于iPhone。我在整个
场景中添加了一个后期效果。即使在win32 gles2模拟器上,模板缓冲区也不会工作。
我试图将模板缓冲区附加到FBO,然后屏幕变为
black。这是我的代码,
glGenRenderbuffers(1,&dbo); //深度缓冲区
glBindRenderbuffer(GL_RENDERBUFFER,dbo);
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT24_OES,
widthGL,heightGL);
glGenRenderbuffers(1,&sbo); //模板缓冲区
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); //这会使整个屏幕变黑
使用STENCIL_SIZE = 8创建eglContext,它没有RTT。
<我尝试为深度缓冲区和
模板缓冲区更改RenderbufferStorage,但它们都不起作用。
我有什么遗漏的吗?模板缓冲区包含
深度缓冲区吗? (我找不到GL_DEPTH24_STENCIL8 ......)
在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);
I need stencil buffer on 3GS to render planar shadow, and polygon offset won't work prefect, still has z-fighting problem. So I use stencil buffer to make the shadow correct, it works on win32 gles2 emulator, but not on iPhone. After I added a post effect to the whole scene. The stencil buffer won't work even on win32 gles2 emulator.
And I tried to attach a stencil buffer to FBO, buf the screen turns to black. Here's my code,
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.
The eglContext is created with STENCIL_SIZE=8, it works without a RTT.
I tried to change the RenderbufferStorage for both depth buffer and stencil buffer, but none of them works.
Is there anything I have missed? Does the stencil buffer pack with depth buffer? (I cannot find things like GL_DEPTH24_STENCIL8 ...)
In OpenGL ES 2.0 on iOS, you have to create a combined depth and stencil renderbuffer using GL_DEPTH24_STENCIL8_OES, and then attach it to the bound framebuffer as both GL_DEPTH_ATTACHMENT and 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);
这篇关于如何在OpenGL ES 2.0中使用模板缓冲区创建FBO?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!