3

在我的公司,我们正在开发一个庞大的库,它是一个独立于平台的渲染器(但它的主要目的不是用于游戏,而是用于专业和办公应用程序)。一切都很顺利,我们已经有了非常高效的 D3D11 和 OpenGL 渲染器,以及用于 Windows 和 Linux (GDI/X11) 的“软件”渲染器。

最近,我们开始在 API 的较低层实施额外的改进。我们认为在较慢的机器上测试它们可能是个好主意。因为 update 与 OpenGL 特定的逻辑交互,所以需要测试这个特定的版本。

我们使用核心帧缓冲对象在 GL 中实现了 RTT(渲染到纹理)。因为较旧的硬件无法使用此解决方案(不支持 ARB_framebuffer),我们创建了简单的包装器,它检测支持的 FBO 版本(ARB_fb_object 或 EXT_fb_object)并以透明的方式包装所有 cals。创建深度模板附件的示例:



    gxFBO::gen_renderbuffers(1, &stencil_buffer_id);
    gxFBO::bind_renderbuffer(GX_RENDERBUFFER, stencil_buffer_id);
    gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GX_DEPTH24_STENCIL8, width, height);
    gxFBO::bind_renderbuffer(GX_RENDERBUFFER, 0);
    gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER, GX_DEPTH_STENCIL_ATTACHMENT, stencil_buffer_id);
    gxFBO::check_framebuffer_status();


快速解释:函数调用等效于 gl* 版本(例如,gxFBO::renderbuffer_storage() 在内部调用 glRenderbufferStorage() 或 glRenderbufferStorageEXT(),基于支持的版本)。预处理器常量也相同(GX_DEPTH24_STENCIL8 = (GL_DEPTH24_STENCIL8 或 GL_DEPTH24_STENCIL8_EXT))。

这在支持 3.0+ 的硬件上运行良好(一切都正确渲染)。但是在较旧的硬件(支持 GL 2.1 和 EXT_framebuffer)上它会失败。

gxFBO::check_framebuffer_status() 中返回的错误是:GL_FRAMEBUFFER_UNSUPPORTED_EXT。

我还尝试为深度和模板创建单独的渲染缓冲区:



    gxFBO::gen_renderbuffers(1, &depth_buffer_id);
    gxFBO::gen_renderbuffers(1, &stencil_buffer_id);

    gxFBO::bind_renderbuffer(GX_RENDERBUFFER, depth_buffer_id);
    gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);

    gxFBO::bind_renderbuffer(GX_RENDERBUFFER, stencil_buffer_id);   
    gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GX_STENCIL_INDEX8, width, height);
    gxFBO::bind_renderbuffer(GX_RENDERBUFFER, 0);

    gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER,
                    GX_DEPTH_ATTACHMENT,
                    GX_RENDERBUFFER, 
                    depth_buffer_id);

    gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER,
                    GX_STENCIL_ATTACHMENT,
                    GX_RENDERBUFFER, 
                    stencil_buffer_id);

    gxFBO::check_framebuffer_status();


帧缓冲区状态检查时出现同样的错误。在这种情况下,任何人都可以帮助进行正确的设置吗?是否可以使用 GL_EXT_framebuffer 做我想做的事情?

4

0 回答 0