我可以使用第二个 OpenGL 上下文在 3D 场景上渲染 UI 吗?

Can I use a second OpenGL context to render a UI on top of a 3D scene?

是否可以使用多个 OpenGL 上下文绘制到同一个 OpenGL 视口,使每个上下文都有自己的、完全独立的渲染状态?

我的用例是一个 3D 场景,我想在其上渲染我的 UI。 UI 使用与 3D 场景截然不同的课程设置 - 一开始没有投影,然后 3D 场景使用旧版 OpenGL,而 UI 使用自定义着色器程序。

所以,我的想法是让每个渲染任务(3D 场景和 UI)使用自己的 OpenGL 上下文,每个渲染任务都可以根据自己的需要配置一次,在 window初始化时间。在渲染时,每个任务将简单地 select 自己的渲染上下文,避免浪费时间重新配置单个上下文。

我现在尝试了这个,但出现了空白屏幕 - 这当然可能是由于我的代码中的错误,但在投入更多时间之前,我想知道这是否是一个值得追求的想法,或者一个违背 OpenGL 的想法。

(我在 Windows 10 下使用 SDL2,使用 GLEW,并使用 Visual Studio 2015 编译 32 位)。

在一个上下文中,每帧 cn,渲染 3D 场景后,禁用 GL_DEPTH_TEST,渲染 2D 部分,然后再次启用它。

如果上下文超过 1 个,您可能应该渲染到 FBO,然后在其上渲染 UI。

这不是一个值得追求的想法。原因如下:

One reason would be to switch between states faster

这不会更快地切换状态。至少,不是在现实世界的表现方面。切换渲染上下文是一项非常的重量级操作。更改上下文状态的每一部分仍然比进行完整的上下文切换

哦,我相信你写得更快。但它不会使您的实际程序更快。

the other to keep the states separate and independent of each other

只需确保让这些不同的渲染操作在操作开始时设置它们所依赖的状态,您就可以很容易地做到这一点。这也具有确保您知道您的操作所依赖的状态的效果。

每个操作都可以有自己独立的对象:VAO、缓冲区、纹理、程序,甚至帧缓冲区。再加上确保在需要时更改重要的全局状态,您就可以将这两个操作分开。