如何在C ++ Opengles iOS中解除绑定glBindFramebuffer

时间:2019-06-27 08:09:50

标签: c++ ios opengl-es

我正在将在Windows和android上运行的程序移植到ios。 以下代码在两个平台上均有效,但在ios上,该代码在执行后停止渲染,我怀疑绑定永远不会解开,这样做的正确方法是什么?

代码的目标是获取纹理像素。

这是代码:

void Texture::Bind()
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, mTextureID);
}

GLubyte* Texture::GetPixels()
{
    Bind();

    int data_size = mWidth * mHeight * 4;

    GLubyte* pixels = new GLubyte[data_size];
#ifdef _WIN32
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
#else
    GLuint fbo;
    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureID, 0);

    glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glDeleteFramebuffers(1, &fbo);
#endif 
    return pixels;
}

1 个答案:

答案 0 :(得分:0)

iOS不适用于索引为0的默认帧缓冲区。您需要绑定用作主缓冲区的缓冲区。这取决于您使用的工具,但是如果直接使用UIView,则应该找到类似于以下内容的代码:

- (instancetype)initWithView:(UIView *)view {

    if((self = [super init])) {
        {
            GLuint bufferID = 0;
            glGenFramebuffers(1, &bufferID);
            glBindFramebuffer(GL_FRAMEBUFFER, bufferID);
            self.frameBufferID = bufferID;
        }
        {
            GLuint bufferID = 0;
            glGenRenderbuffers(1, &bufferID);
            glBindRenderbuffer(GL_RENDERBUFFER, bufferID);
            view.layer.contentsScale = UIScreen.mainScreen.scale;
            [[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)view.layer];
            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, bufferID);
            self.colorBufferID = bufferID;

            GLint width, height;
            glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &width);
            glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);

            self.bufferWidth = width;
            self.bufferHeight = height;
        }
    }
    return self;

}

您正在寻找到renderbufferStorage:fromDrawable:的电话。在它附近应创建一个与该渲染缓冲区关联的帧缓冲区。该帧缓冲区的ID是您需要绑定的ID。

因此,在上面的摘录中,您将使用self.frameBufferID

关于我发布的代码段,它是项目的一部分,该项目从给定的UIView生成帧和渲染缓冲区。首先,它生成帧缓冲区并将其绑定。下一个渲染缓冲区被创建并绑定。然后通过带有图层的本机iOS代码设置渲染缓冲区。我们将渲染缓冲区附加到帧缓冲区。最后提取宽度和高度。

在吸引到此对象之前,将调用以下bind方法:

- (void)bind {
    glBindFramebuffer(GL_FRAMEBUFFER, self.frameBufferID);
    glBindRenderbuffer(GL_RENDERBUFFER, self.colorBufferID);
}