文章目录
一、光栅化
在学习完之前的变换之后,已经能使用我们放置的相机对 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3中的物体进行成像,接下来要做的就是将成像的结果呈现在屏幕上,也就是光栅化。
Viewport transform
如何将 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3的正方体转化到屏幕
- 忽视z轴的数据
- 转化到xy平面空间:
[
−
1
,
−
1
]
2
[-1,-1]^2
[−1,−1]2到
[
0
,
w
i
d
t
h
]
×
[
0
,
h
e
i
g
h
t
]
[0,width] \times [0,height]
[0,width]×[0,height]
得到Viewport transform矩阵
标题如何在像素点上表示一幅图形
inside
(
t
,
x
,
y
)
=
{
1
Point
(
x
,
y
)
in triangle
t
0
otherwise
\text {inside}(t, x, y)=\left\{\begin{array}{ll}1 & \text { Point }(\mathrm{x}, \mathrm{y}) \text { in triangle } \mathrm{t} \\0 & \text { otherwise }\end{array}\right.
inside(t,x,y)={10 Point (x,y) in triangle t otherwise
通过上式对各个像素点进行采样,显然出现了明显的锯齿。接下来要做的就是抗锯齿,反走样。
二、反走样、抗锯齿
先模糊再采样
如何理解上述结果呢,对一幅图像进行傅里叶变换。频域图像越中间,频率越低。
通过高通滤波器后 只剩下边缘信息
通过低通滤波器后 相当于对图像进行模糊
通过带通滤波器
图像滤波
图像的滤波=平均=卷积
时域上对两个信号进行卷积,等于频域上对两个信号进行乘积
采样
采样可以理解为重复信号在频域上的内容
时域上的乘积相当于频域上的卷积
采样的频率越低,会导致信号在频域上出现重叠
(香农采样定理:采样频率高于信号最高频率的一倍,那么,原来的连续信号可以从采样样本中完全重建出来)
如何反走样
- 增加采样率,增加屏幕的分辨率
- 先模糊(低通滤波),再采样
低通滤波后,再用原来的采样率采样,信号在频域就不会发生堆叠
Antialiasing By Supersampling (MSAA)
对原先的每一个像素进行进一步的细化
总结
除了MSAA之外还有很多其他的反走样策略
二维下深度方向的处理
画家算法
当我们要在屏幕上绘制物体的时候,会涉及到物体与物体间的遮挡问题。最常见的做法是像画家绘画那样,先绘制远处的物体,再绘制近处的物体。
画家算法要求我们先在深度上进行一次排序(需要
n
l
o
g
n
nlogn
nlogn的时间),然后再进行绘制。但有些情况是无法通过画家算法来解决的,如下图:这个例子中,无论怎么排序,都无法得到上图的结果。
深度缓冲 (Z-Buffer)
深度缓冲用来记录每个像素的最小深度。
它的工作原理是:每次渲染的时候除了生成最终的图像之外,还生成一张深度图,该深度图记录了每个像素当前的最小深度。
具体实现步骤如下:
- 初始化所有像素的深度为 ∞
- 在光栅化过程中,不断更新其深度:
for (each triangle T)
for (each sample(x,y,z) in T)
if (z < zbuffer[x,y]) {
framebuffer[x,y] = rgb;
zbuffer[x,y] = z;
}
对于 n 个三角形,要得到某个像素的最小深度值,我们只需要遍历所有三角形即可,因此其复杂度为O(n);
深度缓冲还有以下的好处:
绘制三角形的顺序不影响最终结果所有 GPU 都支持深度测试
需要注意的是:深度缓冲并不能处理透明物体。