一、观测变换
通过Viewing(观测)transformation,最终我们将世界坐标系中的物体投影到了一个xyz都处于【-1,1】的立方体中。那么接下来,我们该做什么?
二、光栅化(Rasterization)
(1)透视投影的定义
定义透视投影的视锥需要的参数:
- 长宽比Aspect ratio:width / height
- 垂直的可视角度:fovY
- 远近平面的距离:n和f
通过长宽比和垂直的可视角度可以求出水平的可视角度。
如下图所示,根据fovY和n可以计算出近平面的顶点坐标,再根据宽高比Aspect即可计算出近平面的高度,因此根据上述参数可以计算出所有屏幕的所有信息。远平面同理。
因此我们只需要定义fov和宽高比Aspect以及n和f即可定义一个确定的视锥。
(2)屏幕像素
屏幕的分辨率诸如1920×1080也叫做1080P,数字说明的都是像素的多少。
屏幕是一个典型的光栅成像设备,把图像画在屏幕上的过程就是光栅化的过程。
我们暂时认为像素是呈现颜色的最小单位,其实这是不对的。像素的颜色表示了一个灰度,一般是0~255,使用RGB三个值来表示一个颜色。
屏幕空间中每一个像素使用一个(x,y)坐标来表示,屏幕上的像素就是从(0,0)到(width-1,height-1)。像素的中心其实位于(x+0.5,y+0.5)。
(3)投影立方体到屏幕的映射
将【-1,1】的立方体映射到屏幕【0,width】和【0,height】。
- 映射对应的变换矩阵:
上述变换将立方体空间【-1,1】变换到二维空间【0,width】×【0,height】。我们已经得到了一个二维的图片了,现在我们要把这个图像打散成像素,即光栅化。 - 光栅化是指将图像中的基本图形即图元打碎成像素,将图元打碎成像素后得到每个像素应该显示的颜色,再将图像真正的显示在屏幕上。
(3)屏幕的成像
-
CRT成像设备会逐行逐列去绘制像素的颜色。隔行扫描:奇数行和偶数行交替绘制,在每一帧只绘制奇数行或偶数行。但是隔行扫描可能会造成严重的画面撕裂,特别是高速运动的画面。
-
低分辨率设备如计算器,高分辨率设备如智能手机的屏幕。一些屏幕设备分辨率已经超出了人类视网膜的分辨率,这种屏幕叫做视网膜屏幕。
-
液晶显示器LCD通过液晶对光的扭曲,当光通过光栅时会被扭曲。
-
发光二极管LED,即要么发光要么不发光,可以发出不同的颜色。
(4)如何光栅化
(4.1)从图形到像素
- 三角形可以表达三维和二维的面,三角形是最基础的多边形,任何多边形都可以拆解成三角形,三角形内部永远都是一个平面,三角形内部外部定义清晰。
- 根据三角形内点和三角形顶点的位置关系,可以得到颜色的一个渐变效果。
- 光栅化中最重要的:判断一个像素和三角形的位置关系,更确切的来说考虑像素的中心点和三角形的位置关系。
- 采样,即对某个定义的函数,以像素中心位置为自变量,带入得到的因变量。
(4.2)采样
-
定义函数inside,其中t代表三角形,xy为任意实数。
-
考虑屏幕上的每一个像素:在三角形内还是外
-
如果点在边上,要么不做处理,要么特殊定义。在OpenGL中认为如果点落在左边和上边则其处在三角形内,如果落在右边和下边则不在三角形内。
-
根据三角形的顶点坐标,对x和y取最小和最大,得到三角形的包围盒(两个对角顶点),如下图蓝色区域所示。当循环像素判断是否在三角形内时,只需要循环包围盒内的三角形。(光栅化的加速)
-
更快速的光栅化加速如下图所示,适用于窄长刚好旋转45°处于对角线位置的三角形。
-
人眼对绿色最为敏感,对更多的绿色使得视觉效果更好。RGB值越大越亮。
(5)锯齿和走样
-
锯齿是光栅化中一直在解决的问题,出现锯齿的原因是我们对信号的采样率不够高,因此导致信号的走样。
-
走样即Aliasing,对应的还有反走样、抗锯齿