一:什么是光栅化(Rasterization)
把空间里的物体画在屏幕上。
屏幕由一个个阵列排布的像素点组成,屏幕大小指宽度方向由width个像素点,高度方向由height个像素点。
像素点索引范围:(0, 0) 到 (width - 1, height - 1)
像素点(x, y)的中心坐标为(x + 0.5, y + 0.5), 每个像素点是有面积的。
Canonical Cube:由MVP矩阵变换后所得,xyz在[-1, 1]之间的正方体。
模型是由三角形组成的,因为三角形是最基本的几何平面,能保证是平面,且容易进行插值操作(重心坐标)。
光栅化的过程就是将三角形离散显示在屏幕的每个像素点。
二:光栅化最重要的点:判断中心点与三角形的关系
判断三角形abc 和 点p 的关系
方法如下:
1. 重心坐标法
点p在三角形abc内,满足以下等式:
S
a
b
p
+
s
b
c
p
+
s
c
a
p
≤
s
a
b
c
S_{abp} + s_{bcp} + s_{cap} \leq s_{abc}
Sabp+sbcp+scap≤sabc
点p在三角形abc外,满足以下等式:
S
a
b
p
+
s
b
c
p
+
s
c
a
p
>
s
a
b
c
S_{abp} + s_{bcp} + s_{cap} > s_{abc}
Sabp+sbcp+scap>sabc
2. 同侧法
如果p在ab的左侧,p在bc的左侧,p在ca的左侧,则p在三角形内,否则不在三角形内。
即红绿蓝三组向量分别叉乘,同号为同一侧。
三: 什么是采样
采样就是把一个函数给离散化的过程
循环屏幕上每个像素格子,判断中心是否是否在三角形内部,是的为1,否为0。
优化手段:
-
使用AABB包围盒,获取三角形xy的最小/最大的坐标形成AABB包围盒,在包围盒外的像素绝对不会在三角形内,以此剔除屏幕上大部分像素。
-
获取每一行像素在三角形内的起始点和终止点,则中间的像素均在三角形内,适合斜 4 5 。 45^。 45。狭长的三角形。
四: 光栅化后的问题
采样产生的一些问题:
- 锯齿
- 摩尔纹
- 人眼在时间上的采样跟不上速度
本质:信号的速度太快,采样速度跟不上变化的速度
因此需要抗锯齿,反走样
抗锯齿其实并没有让像素面积更细,而是让像素颜色不是非0即1,取中间的某一个值,从而在宏观上看不会锯齿明显。
抗锯齿后,边界看上去会模糊。
什么叫走样
同样的采样方法采样两种不同频率的函数,得出的结果我们无法区分它。
即采样不足导致锯齿。
数字图像处理:滤波 Filtering
傅里叶级数展开: 任何一个周期函数,可以写成一系列正弦、余弦的组合以及一个常数项。
傅里叶变换: 所谓傅里叶变换就是将函数分解成各个不同频率的函数的组合。
傅里叶变换可以理解为将信号从时域变换成频域。
滤波:
从频率的角度上来说,去掉一些特定的频率
通过频域上的分析,不同的频率和信号的变化
去掉中中间的低频信息 高通滤波
高频率 边界
低通滤波,去掉高频信息,变模糊
低频高频都去掉了 留下了其他信息
简单的定义:Filtering(滤波) = Convolution(卷积) = Averaging(平均)
什么是卷积?
卷积定理:时域的卷积等于频域的乘积
采样与走样在频域上的解释
Sampling = Repeating Frequency Contents
采样 = 重复频域上的内容
走样:采样不够快,导致频谱上复制粘贴间隔变小,发生混叠
五: 反走样/抗锯齿
增加采样率(受制于物理限制,不可能将屏幕分辨率弄高)
1,做模糊操作,先模糊再采样
即先把一个信号 高频信息拿掉,让频谱覆盖的面小一些,再采样,以原本的间隔复制它,
2. MSAA
在一个像素格子里增加多个采样点,得到近似的像素格子覆盖率。
增大了计算量来达到抗锯齿的效果。
如下图:每个像素采样四个点,最后按采样点在三角形内的个数比例决定颜色比例。
3. FXAA (Fast Approximate AA)
找到有锯齿的边界,把边界换成没有锯齿的边界(和采样无关,在图像层面上抗锯齿)
通过颜色变化找到边界后,进行颜色混合,起到抗锯齿的作用
4. TAA(Temporal AA)
在不同的帧时间上,用像素中的不同的点来采样像素颜色。即将MSAA的采样分解在时间上。
5. 超分辨率/超采样/ DLSS (Deep Learning Super Sampling)
通过降低游戏内的渲染分辨率,同时再通过人工智能算法模型和AI加速硬件单元(Tensor Core)来拉伸输出画面,提高显示分辨率,例如使用1080P的渲染分辨率再通过AI算法和Tensor Core运算输出4K(2160P)的显示分辨率,以此来达成提升帧数的目的。