如何在 OpenGL ES 2.0 中创建带有模板缓冲区的 FBO? [英] How to create a FBO with stencil buffer in OpenGL ES 2.0?

查看:17
本文介绍了如何在 OpenGL ES 2.0 中创建带有模板缓冲区的 FBO?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要 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屋!

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