5.1 屏幕比例问题(We Have an Aspect Ratio Problem)
现在我们知道在OpenGL里面所有渲染的东西在x轴及y轴上都限制在[-1,+1]范围内,z轴上也存在同样的限制。在这个范围内的坐标有一个特殊的称呼:规范化坐标空间,同时独立于屏幕的大小和形状。不幸的是因为独立于实际屏幕尺寸,假如我们直接使用这些坐标那将会产生一些问题,比如横屏模式下的挤压问题。
假如有一个屏幕尺寸为1280 x 720,在Android上这是一个通用的屏幕分辨率。同时为了简单起见,假设使用整个屏幕进行显示。如果我们的设备是竖屏模式,[-1, +1]将会映射到屏幕的1280像素高度,但是宽度只有720像素。这样的话图像在显示的时候就会产生挤压问题。
规范化设备坐标假定坐标空间是正方形的,下如下图所示:
然而,由于实际的视口(viewport)可能并不是正方形的,这时图片会在一个方向拉伸而在另一个方向产生挤压。当一张图片显示在竖屏模式下的规范化设备空间时将会在水平方向上产生挤压,如下图所示:
同样的,当在横屏模式下时,将会在垂直方向上产生挤压,如下图所示:
5.1.1 调整屏幕比例(Adjusting to the Aspect Ratio)
我们需要考虑屏幕形状以调整坐标空间,一种方法是把尺寸较小的一边规范化到[-1, +1],同时根据屏幕尺寸调整较大边的比例。
举个例子:比如在竖屏模式下,宽度是720,高度是1280,我们仍然把宽度映射到[-1, 1],高度规范化到[-1280/720,
1280/720] or [-1.78, 1.78]。当在横屏模式下时,把宽度映射到[-1.78, 1.78],高度映射到[-1, 1]。
通过改变坐标空间,我们可以改变已有的OpenGL绘制范围,这样的话图像在竖屏和横屏模式下都会保持同样的显示效果,如下图所示:
下一节我们将学习虚拟坐标空间。