相对于以上变换,视口变换更为简单一些,视口变换最终决定显示出来的图片大小。视口变换类似于冲印的照片底片后最终决定放大还是缩小照片,还决定照片放在相框的哪个位置。
视口变换通过方法glViewport实现,该方法接受四个参数,第一个参数和第二个参数指定图片的左下角出现在什么位置,第三个和第四个参数用于指定生成图片的宽和高。
在上一节讨论的投影变换中已经指定了生成图片的纵横比例,一般而言视口变换中指定的高和宽的比例应该和投影变换中指定的纵横比相同,这样图像才不会变形。如果视口变换中指定的高宽比例和投影变换中的纵横比不相同,则系统会自动对图片进行变形处理,使投影变换中生成的图片适应视口变换中指定的高宽比例。
另外需要注意的是前两个参数所指定的图片位置是图片左下角的位置,同时坐标轴的原点在屏幕的左下角上。如果调用方法glViewport(0,0,100,100)表示图片的高和宽都是100,图片的左下角对齐屏幕的左下角。如果调用方法glViewport(50,30,100,100)则表示图片左下角离屏幕左边50个像素点,离屏幕下边30个像素点。
OpenGLDemo样例在CubeRenderer的sizeChanged方法中调用了glViewport,代码片段如下,传入的width和height是窗口的大小,glViewport方法将图片设置成和窗口大小相同。
public void sizeChanged(GL10 gl, int width,int height) {
gl.glViewport(0, 0, width, height);
// 其它设置…
}
而OpenGLScreen的renderFrame方法在运行过程中会计算屏幕大小是否有变化,如果有变化的话则调用CubeRenderer的sizeChanged方法重设视口大小。这也是为什么OpenGLScreen样例在关闭过程中随着窗口的变小图像会随着变小的原因。