多个OpenGL上下文/视图

时间:2015-06-09 14:02:57

标签: opengl

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

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

2 个答案:

答案 0 :(得分:0)

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

解决方案1:一个上下文

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

解决方案2:多个视口

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

答案 1 :(得分:0)

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

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