Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用第二个OpenGL上下文在3D场景上渲染UI吗?_Opengl_Sdl 2 - Fatal编程技术网

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

我可以使用第二个OpenGL上下文在3D场景上渲染UI吗?,opengl,sdl-2,Opengl,Sdl 2,是否可以使用多个OpenGL上下文绘制同一个OpenGL视口,使每个上下文都有自己的、完全独立的渲染状态 我的用例是一个3D场景,我想在上面渲染我的UI。当然,UI使用的设置与3D场景非常不同——首先没有投影,然后3D场景使用传统OpenGL,而UI有一个自定义着色器程序 因此,我的想法是让每个渲染任务(3D场景和UI)使用自己的OpenGL上下文,每个任务可以在窗口初始化时根据自己的需要配置一次。在渲染时,每个任务只需选择自己的渲染上下文,避免浪费时间重新配置单个上下文 我现在尝试了一下,但是

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

我的用例是一个3D场景,我想在上面渲染我的UI。当然,UI使用的设置与3D场景非常不同——首先没有投影,然后3D场景使用传统OpenGL,而UI有一个自定义着色器程序

因此,我的想法是让每个渲染任务(3D场景和UI)使用自己的OpenGL上下文,每个任务可以在窗口初始化时根据自己的需要配置一次。在渲染时,每个任务只需选择自己的渲染上下文,避免浪费时间重新配置单个上下文

我现在尝试了一下,但是得到了一个空白屏幕——这当然可能是由于我的代码中的错误,但在投入更多时间之前,我想知道这是一个值得追求的想法,还是一个与OpenGL格格不入的想法


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

使用一个上下文,在渲染3D场景后,对每个帧进行cn,禁用
GL\u DEPTH\u TEST
,渲染2D部分,然后再次启用它


如果有超过1个上下文,您可能需要渲染到FBO,然后再在上面渲染UI。

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

其中一个原因是更快地在状态之间切换

这不会更快地切换状态。至少,从现实世界的表现来看不是这样。切换渲染上下文是一项非常重要的操作。更改上下文的每一部分状态仍然比执行完整上下文切换要快

哦,我相信你写得更快。但这不会让你的实际程序更快

另一个是保持各州之间的独立性

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


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

这不是我遇到的问题-我的3D场景无法渲染。就像我说的,那可能是因为我犯了个错误,然后,在我引入第二个上下文之前,它再次进行了渲染。我创建多个上下文的想法是为了避免每次渲染之前都必须手动设置状态-FBO很可能会比这更耗时。@jpnotadagon:我很想知道假设FBO更改较慢的依据是什么而不是渲染上下文开关。仅仅因为一个方法涉及更多的函数调用并不意味着它的速度较慢。@Nicolas:FBO必须在某个点复制到输出缓冲区;这不仅会降低渲染速度,还会将视频内存消耗增加两倍。。。。你为什么要这么做?为什么不简单地使用一个渲染上下文,将渲染状态更改为适合您想要执行的渲染操作的任何状态?@Nicolas一个原因是更快地在状态之间切换,另一个原因是保持状态彼此独立。问题是OpenGL上下文是否打算以这种方式工作。切换上下文如此重要有什么原因吗?我知道需要冲洗管道,但在许多情况下,包括这一次,由于glUseProgram(),这种情况很可能发生。如果有一种合成渲染的方法,而不必手动管理所有状态,那就太好了。“写得更快”不是我的主要目标。@JPN:“我意识到有必要冲洗管道”需要更多的理由吗?更改OpenGL状态不会导致管道刷新。读取OpenGL状态,或调用
glFlush
glFinish
会导致管道刷新。