在我的公司,我们正在开发一个巨大的图书馆,这是一个独立于平台的渲染器(但它的主要功能不是用于游戏,而是用于专业和办公应用)。 一切都很顺利,我们已经有一个非常高效的D3D11和OpenGL渲染器,以及Windows和Linux(GDI / X11)的“软件”渲染器。
最近,我们已开始在API的较低层实施其他改进。我们认为在较慢的机器上测试它们可能是个好主意。由于update与特定于OpenGL的逻辑交互,因此需要测试此特定版本。
我们使用核心帧缓冲对象在GL中实现了RTT(渲染到纹理)。因为较旧的HW无法使用此解决方案(没有ARB_framebuffer支持),所以我们创建了简单的包装器,它检测支持的FBO版本(ARB_fb_object或EXT_fb_object)并以transprent方式包装所有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做我想做的事情?