多个 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 2.1 的多个共享上下文中同时从同一个缓冲区对象进行渲染?
是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?