基本概念
什么是屏幕(Screen)
屏幕是一个典型的光栅(raster)化的成像设备,在计算机图形学中把其当做一个二维数组,数组的大小被称为分辨率(resolution),每个元素是一个像素(Pixel)。
光栅化(Rasterize)
光栅化(Rasterize)就是把东西画在屏幕上的过程。光栅(Raster)就是德语中的屏幕。
像素(Pixel)
像素是图片单元(picture element)的简写,可以当作一个只带有一种颜色的小方块(颜色是rgb(红绿蓝0-255)的混合)。
屏幕空间(Screen-Space)
屏幕空间就是在屏幕上建立一个坐标系(左下角是原点)。有以下一些约定:
- 像素的坐标写成(x,y)的形式,例如下图蓝色坐标为(2,1)。
- 像素坐标的范围是从(0,0)到(width-1,height-1)的。
- 像素中心为(x+0.5,y+0.5)
- 屏幕的覆盖范围是从(0,0)到(width,height)的。
视口变换(Viewport transform)
经过MVP变换,得到将所有物体都映射到了正则立方体中[-1,1]3,接下来进行视口变换将正则立方体映射到屏幕空间。
具体过程为:
- 忽略z
- 将xy平面上的[-1,1]2(进行缩放和平移)成[0,width] X [1,height]
- 计算出视口矩阵Mviewport
经过视口变换,我们就确定了屏幕上一些边界点的坐标,接下来我们就要把轮廓内的东西画到屏幕上来进行显示。
三角形 - 基础图元
三角形作为基础图元的好处
- 三角形是最基础的多边形。
- 任何其他的多边形可以拆成多个三角形。
- 三角行肯定是个平面(planar)(四边形弯折一个顶点就可以在不同的平面中了)。
- 内部容易区分(通过叉积可以快速判断点是否在三角形内,判断方法可以回顾第二节的内容)。
- 方便不同的属性进行插值(从一个顶点到另一个顶点内部属性的变化)。
使用像素表示三角形
经过MVP变换和视口变换就可以得到三角形三个顶点的坐标,接下来要将这个坐标转化为像素的集合。
这个过程的输入是三角形顶点投影到屏幕上的位置,输出是像素值的集合,如下图所示:
根据上图我们很容易得到,三角形内部的点一定是要着色的,可是三角形边缘的点怎么办呢?
我们可以通过采样等方式来判断像素(中心点)与三角形的位置关系(在内还是在外?),进而判断边缘的点是否该被染色。
光栅化
采样过程
对屏幕进行采样判断像素点的中心是否在三角形内部。
使用向量的叉乘判断点是否在三角形内部,如果在内部就染色,否则不染色,写出采样函数:
变量屏幕上像素中心点,采样:
遍历屏幕上所有的像素点,十分浪费性能,引入包围盒。包围盒就是圈定三角形顶点的xy最小值和最大值的范围。我们不用遍历整个屏幕只要判断包围盒内的点即可。(AABB包围盒)
注意:
对于边界情况,可以做处理也可以不做处理。比如我们可以认为,下面的每种说法都是对的:
- 图中的点在三角形1内
- 图中的点在三角形2内
- 图中的点在三角形1和三角形2内
光栅化加速
相当于每一行设置一个包围盒,每一行只采样当前行包围盒内的像素。
适合比较窄的和旋转的三角形。
光栅化的问题
锯齿(Jaggie)或走样(Aliasing)
如图所示,直接栅格化后,边界并不像一个三角形。