OpenGL之Viewport
1.1 窗口(Screen)
窗口其实就是屏幕,如下图1中红色圈中黑色背景的部分。所有的场景最终都是要被光栅化乘显示器上的图像,屏幕是所有场景(2D、3D等)的最终输出目的地。一个screen可以显示多个视口中的内容;
1.2 视口(Viewport)
视口就是窗口中用来显示图形的一块矩形区域,它可以和窗口等大,也可以比窗口大或者小,如图1中蓝色标示的绿色背景的区域。它具有两个意义:
? 定义了视镜体中的景物要被绘制到一张什么尺寸的画布之上;
? 定义了画布在屏幕的什么区域;
显然,如果 视景体的投影平面 定义的宽高比和 视口 所定义的宽高比 不相同 的话,那么将视景体中的物体绘制到画布上的时候会进行 拉伸或者压缩 ;而当视景体投影平面的宽高比和视口所定义的宽高比一致的时候,图像将会不进行任何缩放绘制到视口所定义的画布之上。
在实际应用中,一个窗口中会绘制多个3D场景,这个通过定义多个视口,绘制多个图像,然后 贴在 屏幕的不同区域即可。比如图中黄色笔圈中的区域,在画布中定于两个不同的viewport1 (0,0;w/2,y)和 viewport2 (0,w/2;w/2,y);
1.4 视镜体(View Frustum)
视景体(View Volume)定义了我们能够通过虚拟的3D摄像机所能看到的场景。在一个3D场景中站立中,需要摄像机的 摆放位置 和 视野 来定义我们所能够看到的东西,而这个视野就是通过视景体来定义的。在3D中,一般可以通过以下两种方式来定义视景体:
通过前面的介绍,我们大致的了解了这三个不同东西的概念。从中我们可以知道,通过定义投影矩阵,我们实际上是在虚拟的3D空间中,创建了一个视野,也就是视景体。在接着,我们通过定义视口,来描述视景体中的内容如何映射到一个虚拟的画布之上,并且这个画布最终将显示在屏幕上的什么位置。当所有的这些都设置完毕,我们绘制完毕场景之后,就能够通过硬件在我们的显示器屏幕上看到最终的画面。更理论的表述就是,通过定义投影矩阵,将3D场景投影到一个投影平面之上。通过定义视口,我们将投影平面上的内容映射到这个视口中去,并且填满它,同时根据定义视口是给定的屏幕坐标的位置,将这个视口中的图像映射到窗口的指定位置之上,最终我们就看到了图像。
glViewport是OpenGL中的一个函数。计算机图形学中,在屏幕上打开窗口的任务是由窗口系统,而不是OpenGL负责的。glViewport在默认情况下,视口被设置为占据打开窗口的整个像素矩形,如图1,窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。