EGL:创建 pBuffer 表面时会创建 FBO 吗?

EGL: Does a FBO get created when creating a pBuffer surface?

我正在 ARM GPU 上使用 EGL,我正在使用 pbuffer 进行离屏渲染。我按照文档中描述的标准程序来设置所有内容:

    EGLDisplay display;
    EGLConfig config;
    EGLContext context;
    EGLSurface surface;
    EGLint num_config;

    // assume I allocated both attrib lists somewhere
    attribute_list[0] = EGL_SURFACE_TYPE;
    attribute_list[1] = EGL_PBUFFER_BIT;
    attribute_list[2] = EGL_RENDERABLE_TYPE;
    attribute_list[3] = EGL_OPENGL_ES2_BIT;
    attribute_list[4] = EGL_OPENGL_RED_SIZE;
    attribute_list[5] = 8;
    attribute_list[6] = EGL_OPENGL_GREEN_SIZE;
    attribute_list[7] = 8;
    attribute_list[8] = EGL_OPENGL_BLUE_SIZE;
    attribute_list[9] = 8;
    attribute_list[9] = EGL_OPENGL_ALPHA_SIZE;
    attribute_list[10] = 8;
    attribute_list[11] = EGL_OPENGL_DEPTH_SIZE;
    attribute_list[12] = 8;
    attribute_list[13] = EGL_NONE;

    pbuffer_attribs[0] = EGL_WIDTH;
    pbuffer_attribs[1] = 512;
    pbuffer_attribs[2] = EGL_HEIGHT;
    pbuffer_attribs[3] = 512;
    pbuffer_attribs[4] = EGL_NONE;

    /* get an EGL display connection */
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    /* initialize the EGL display connection */
    eglInitialize(display, NULL, NULL);

    /* get an appropriate EGL frame buffer configuration */
    eglChooseConfig(display, attribute_list, &config, 1, &num_config);                

    /* create an EGL rendering context */
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);

    /* create the surface */
    surface = eglCreatePbufferSurface(display, config, pbuffer_attribs);

    /* connect the context to the surface */
    eglMakeCurrent(display, surface, surface, context);

在此之后,我的读写应该与此屏幕外相关联 pBuffer,对吗?这个 pBuffer 是否有一个 FBO 不同于与之关联的默认帧缓冲区?我 运行 遇到的问题是当我尝试 glReadPixels 时遇到 GL_FRAMEBUFFER_UNDEFINED 错误。此错误发生在:

    GL_FRAMEBUFFER_UNDEFINED is returned if target is the default framebuffer, but the default framebuffer does not exist.

我对这个错误的解读是我正在渲染默认的 FBO 而不是 pBuffer FBO。这种解释正确吗?如果是这样,我还需要做什么才能读取和写入 pBuffer FBO?

如果上述序列成功完成(没有错误),那么,是的,屏幕外 pBuffer 将成为 OpenGL ES 上下文的默认帧缓冲区,并且所有读取和写入都将与 pBuffer 相关联(除非非默认 FBO已绑定)。

值得在每次 EGL 调用后检查 eglGetError() returns EGL_SUCCESS。您的代码清单的以下部分看起来很可疑:

attribute_list[9] = 8;
attribute_list[9] = EGL_OPENGL_ALPHA_SIZE;