如何在 OpenGL ES 2.0 中创建带有模板缓冲区的 FBO? [英] How to create a FBO with stencil buffer in OpenGL ES 2.0?
问题描述
我需要 3GS 上的模板缓冲区来渲染平面阴影和多边形offset 无法完美运行,仍然存在 z-fighting 问题.所以我用模板缓冲区使阴影正确,它适用于win32 Gles2模拟器,但不是在 iPhone 上.在我给整体添加了后期效果之后场景.即使在 win32 gles2 模拟器上,模板缓冲区也无法工作.
我尝试将模板缓冲区附加到 FBO,但屏幕变为黑色的.这是我的代码,
<上一页>glGenRenderbuffers(1, &dbo);//深度缓冲区glBindRenderbuffer(GL_RENDERBUFFER, dbo);glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES,宽度GL,高度GL);glGenRenderbuffers(1, &sbo);//模板缓冲区glBindRenderbuffer(GL_RENDERBUFFER, sbo);glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, widthGL,高度GL);glGenFramebuffers(1, &fbo);glBindFramebuffer(GL_FRAMEBUFFER, fbo);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,特克斯,0);glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER, dbo);glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,GL_RENDERBUFFER, sbo);//这会使整个屏幕变黑.eglContext 使用 STENCIL_SIZE=8 创建,无需 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屋!