EGL:创建 pBuffer 表面时是不是会创建 FBO?

Posted

技术标签:

【中文标题】EGL:创建 pBuffer 表面时是不是会创建 FBO?【英文标题】:EGL: Does a FBO get created when creating a pBuffer surface?EGL:创建 pBuffer 表面时是否会创建 FBO? 【发布时间】:2016-04-05 08:27:17 【问题描述】:

我在 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?

【问题讨论】:

您是否从示例代码中忽略了 GL 上下文的创建?我看到你传递了 EGL_NO_CONTEXT eglCreateContext,所以我不明白你期望任何 GL 调用如何工作。 @Jan-Harald 根据the documentation,传入 EGL_NO_CONTEXT 意味着没有其他上下文共享正在创建的上下文。我的理解是 eglCreateContext 函数创建了我试图渲染到的上下文......尽管这种理解可能不正确。 我的错。请参阅下面的答案。 【参考方案1】:

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

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

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

【讨论】:

以上是关于EGL:创建 pBuffer 表面时是不是会创建 FBO?的主要内容,如果未能解决你的问题,请参考以下文章

egl 表面属性未实现?

我的OpenGL学习进阶之旅EGL简介

JavaFX 0x300b:无法获得 EGL 表面

enumerate 是不是会创建其参数的副本?

我的OpenGL学习进阶之旅EGL简介

当我们创建没有扩展名的新文件时,会创建啥类型的文件?