【问题标题】:How to create a FBO with stencil buffer in OpenGL ES 2.0?如何在 OpenGL ES 2.0 中创建带有模板缓冲区的 FBO?
【发布时间】:2016-11-30 14:32:43
【问题描述】:

我需要 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 这样的东西……)

【问题讨论】:

  • 您可以检查 glCheckFramebufferStatus() 的返回值以获取更多信息
  • 已完成,未报告错误。
  • 我发现 GL_OES_packed_depth_stencil 在 OpenGLES.framework 中定义。但我在 Win32 上的 PVR OpenGLES2 模拟器中没有找到它 :( 我明天会尝试让它在设备上运行。
  • 当我生成渲染缓冲区并将其存储设置为 GL_DEPTH24_STENCIL8_OES 时,glCheckFramebufferStatus 报告了 GL_FRAMEBUFFER_UNSUPPORT。我很困惑。 iPhone 上的 GLES2 应该支持模板缓冲区。
  • 解决了... Stencil 缓冲区仅适用于 iPhone 设备,无法在 Win32 和 Mac 上的模拟器上运行。 Errrr..

标签: iphone opengl-es


【解决方案1】:

在 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);

【讨论】:

  • 这让我想知道为什么他们甚至提供GL_STENCIL_INDEX8GL_STENCIL_INDEX8_OES 如果这些实际上没有实现并且不起作用。
  • @bobobobo 如果您不想同时使用深度/模板缓冲区,它们可以工作
【解决方案2】:

请注意,如果你使用的是GLKView,那么简单

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

视图在哪里:GLKView*

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2011-03-09
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多