多个 OpenGL 上下文/视图

Posted

技术标签:

【中文标题】多个 OpenGL 上下文/视图【英文标题】:Multiple OpenGL contexts / views 【发布时间】:2015-06-09 14:02:57 【问题描述】:

我应该编写一个 OpenGL 程序,它显示一个对象的 3D 视图,两个视图分别显示 3D 对象的横截面,一个视图显示对象的扫描信号。所有这些都驻留在一个 Windows 窗口(对话框窗口)中。根据定义,这四个视图的内容是相互关联的,但是从 OpenGL 的角度来看,我很难弄清楚如何实现这四个视图。

我应该选择多 OpenGL 上下文还是多视口解决方案? 如何将着色器程序链接到每个单独的上下文或视口?每个视图会有单独的着色器程序吗?

【问题讨论】:

我没做过,不过相信你用glViewport把画布限制在窗口的一部分,然后正常渲染;对每个视图重复。 【参考方案1】:

正如您已经发现的那样,您基本上有两种选择如何从不同的角度展示模型。选择哪一个取决于您的需求,因为两者都有一些优点和一些缺点。

解决方案 1:一个上下文

在这种情况下,您可以使用 glViewport 指定要渲染每个视图的区域,然后正常渲染。在这种情况下,您只需要一次数据和着色器,因为您在相同的上下文中进行渲染。这种方法的缺点是,所有视图一起必须跨越一个矩形区域,它们之间没有任何其他控件。此外,不可能在不同的窗口中呈现不同的视图。

解决方案 2:多个视口

在这里,每个视图分别有一个窗口句柄(和一个上下文)。在这种情况下,对不同视图的排列没有限制,但是您必须多次加载数据和着色器(在每个上下文中加载一次)。根据您正在使用的系统,可能有一些选项可以在不同的上下文之间共享 OpenGL 对象。

【讨论】:

【参考方案2】:

即使使用单个 OpenGL 上下文,您也可以通过多种方式实现此目的。一些明显的选择是:

使用glViewport - 此函数定义OpenGL 将在窗口上绘制的位置(以像素为单位的矩形)。为 3D 视图调用一次(可能类似于 glViewport(0, 0, window_width / 2, window_height / 2)),渲染 3D 视图,调用第一个横截面,渲染它,等等。 使用离屏渲染 - 创建一个帧缓冲区,渲染到帧缓冲区的指定角落(可以认为是一个虚拟屏幕),并在窗口上从帧缓冲区绘制最终纹理。

【讨论】:

以上是关于多个 OpenGL 上下文/视图的主要内容,如果未能解决你的问题,请参考以下文章

具有多个设备(监视器)的 OpenGL 上下文

我是不是允许在 OpenGL 2.1 的多个共享上下文中同时从同一个缓冲区对象进行渲染?

是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?

我是不是需要分别为每个 opengl 上下文加载函数?

使用 ubuntu 在不同的显示器上共享 opengl 上下文

Open GL:多线程 glFlushMappedBufferRange?