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

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

问题描述

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

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