屏幕也称显示屏,屏幕是一个典型的光栅显示设备,常用的显示屏又有标屏与宽屏,标屏宽高比为 4:3,宽屏宽高比为 16:10 或 16:9。
屏幕分辨率是指纵横向上的像素点数,单位是px,屏幕分辨率确定计算机屏幕上显示多少信息的设置,以水平和垂直像素来衡量。就相同大小的屏幕而言,当屏幕分辨率低时(例如 640 x 480),在屏幕上显示的像素少,单个像素尺寸比较大。屏幕分辨率高时(例如 1600 x 1200),在屏幕上显示的像素多,单个像素尺寸比较小。
像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
从像素的思想派生出几个其它类型的概念,如体素(voxel)、纹素(texel)和曲面元素(surfel),它们被用于其它计算机图形学和图像处理应用。
转化过程中注意:
与Z无关(z的值其实是物体在世界空间中的深度值,目前只考虑有一个物体,所以不考虑深度信息)
对xoy平面进行转换,[-1,1]^2转换到 [0,width] × [0,height]
对xoy平面转换的矩阵为:
M viewport = ( w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ) M_{\text {viewport }}=\left(\begin{array}{cccc}\frac{w i d t h}{2} & 0 & 0 & \frac{w i d t h}{2} \\ 0 & \frac{h e i g h t}{2} & 0 & \frac{h e i g h t}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Mviewport =⎝⎜⎜⎛2width00002height0000102width2height01⎠⎟⎟⎞
称之为视口矩阵。对这个矩阵进行解析:
先将规范立方体的中心移动到(width/2,height/2)的位置,然后再对规范立方体进行缩放,接着对其进行平移,因为规范立方体中的中心位于原点的位置,而屏幕空间的坐标是从左下角开始为原点(0,0),不存在负坐标。因为与z无关,所以对z不做任何变换。
光栅化就是将投影的内容画到屏幕上的过程,其过程就如上面所说,最终将规范立方体的内容画到了屏幕上,这个过程就是光栅化。
像素是一个颜色均匀分布的正方形的小格子,那么如果遇到下面这种情况,如何用像素表示三角形?
一个简单的解决方法是采样(sampling)
比如我有一个函数f(x,y),在屏幕上的根据要求 ,比如隔一个点求一个f(x,y)的值,或者求一小块区域内的某一个点的作为这个区域的值,这就是采样。我们可以通过采样对函数离散化。
像素中心作为采样点,如果该点位于三角形内部,用橙色标记,如果不在则不变。
用函数的实现就是定义一个二值函数: inside(tri,x,y)
inside ( t , x , y ) { 1 Point ( x , y ) in triangle t 0 otherwise (t, x, y) \begin{cases}1 & \text { Point }(x, y) \\ & \text { in triangle } t \\ 0 & \text { otherwise }\end{cases} (t,x,y)⎩⎪⎨⎪⎧10 Point (x,y) in triangle t otherwise
如图所示:
//伪代码
for(int x=0;x<xmax;++x)
{
for(int y=.;y<ymax;++y)
{
image[x][y]=inside(tri,x+0.5,y+0.5);
}
}
这边有一个问题如何判断像素中心点是否在三角形内部
方法一:面积法
计算三角形顶点与像素点围成的面积与原始三角形面积的大小是否一致。如图所示,若是像素点位于三角形内部面积一致,若是像素点位于三角形外部面积则大于原始三角形面积。
方法二:叉乘
按照逆时针(或者顺时针)的方式,判断边向量和该边向量的出发点到该点的向量 的叉乘是否都指向屏幕内或者屏幕外。若是,则点在在三角形内部,若不是,则点在三角形外部。如图所示:
在三角形内部
在三角形外部
对所有像素中心点做上述采样操作得到的采样会出现锯齿,如图所示,橙色点为像素中心点
如果用上面的方法进行光栅化,那么最后得到的三角形就是这样的
这和我们想要的三角形相差太多,锯齿很明显。所以就要对其进行抗锯齿操作,之后会介绍。