【问题标题】:Does iOS5 support both GL_STENCIL_INDEX and GL_STENCIL_INDEX8?iOS5 是否同时支持 GL_STENCIL_INDEX 和 GL_STENCIL_INDEX8?
【发布时间】:2011-11-16 10:15:10
【问题描述】:

使用以下代码:

GLuint viewRenderbuffer, viewFramebuffer, viewDepthbuffer, stencilBuffer;
// Create the framebuffer object
glGenFramebuffers(1, &viewFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);

// Create a render buffer and bind it to the FBO.
glGenRenderbuffers(1, &viewRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &imageWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &imageHeight);

// Create a depth buffer and bind it to the FBO.
glGenRenderbuffers(1, &viewDepthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewDepthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, imageWidth, imageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, viewDepthbuffer);

// Create a stencil buffer to crop the rendered scene and bind it to the FBO.
glGenRenderbuffers(1, &stencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, stencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX, imageWidth, imageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilBuffer);

// Check the FBO.
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"Failure with framebuffer generation: %d", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}

使用GL_STENCIL_INDEX,我得到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 错误。使用GL_STENCIL_INDEX8,我得到GL_FRAMEBUFFER_UNSUPPORTED 错误。两者都是由最后一个 glFramebufferRenderbuffer() 函数引起的,该函数应该将模板缓冲区绑定到 FBO。

此外,当我检查 GL_RENDERBUFFER_STENCIL_SIZE 的值时,GL_STENCIL_INDEX8 得到了正确的值 (8),但 GL_STENCIL_INDEX 得到了 0。

有了这个,我就无法获得一个带有模板缓冲区的功能完整的 FBO。是因为GL_STENCIL_INDEX吗?这里应该使用哪一个?

【问题讨论】:

    标签: ios opengl-es-2.0 fbo stencil-buffer


    【解决方案1】:

    似乎在 OpenGL ES 2.0 中至少在 iOS 上(不确定其他操作系统)您必须创建组合深度缓冲区和模板缓冲区。 我列出了我的设备(带有 iOS 5.0.1 的 iPhone 4)上支持的所有扩展,唯一与模板缓冲区相关的是:

    GL_OES_packed_depth_stencil

    这表明您必须创建一个组合深度+模板缓冲区(取自 iPhone 3D Programming 一书)

    // Create a packed depth stencil buffer.
    GLuint depthStencil;
    glGenRenderbuffersOES(1, &depthStencil);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencil);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, width, height);
    
    // Create the framebuffer object.
    GLuint framebuffer;
    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
                                 GL_RENDERBUFFER_OES, color);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
                                    GL_RENDERBUFFER_OES, depthStencil);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES,
                                 GL_RENDERBUFFER_OES, depthStencil);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, color);
    

    【讨论】:

    • 我之前尝试过相同的示例代码,但是当我使用 OpenGL ES 2 时,我删除了所有 _OES 后缀...但是因为打包的深度/模板缓冲区是一个扩展,我应该有保留一个用于 GL_DEPTH24_STENCIL8_OES。这就是这样工作的。感谢 JimN,不感谢 Apple...
    • 从 Apple 的文档“OpenGL ES Programming Guide for iOS”中的“Platform Notes”部分和“PowerVR SGX 的发行说明和最佳实践”标题下,我们读到:“在 iOS 4.0 和更高版本中, 不支持单独的模板缓冲区。使用组合的深度/模板缓冲区。”。我不知道这是否也适用于 PowerVR MBX,但由于从 Xcode 4.5 开始不再支持 iPhone 3G,所以这是一个有争议的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多