前言
作业2以及相关知识的笔记
本课程的主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
光栅化
显示屏是一个光栅化的成像设备,我们假设屏幕是由像素点组成的我们假设像素是均匀填充的小方块,每个像素点由rgb三种颜色决定,rgb的范围都是0到255。屏幕中的任何一个像素我们假设它的中心为
(
x
+
0.5
,
y
+
0.5
)
(x+0.5,y+0.5)
(x+0.5,y+0.5)。在之前的变换中,我们把物体压缩到了-1到1的空间中,在呈现的时候,要让物体根据屏幕的大小而变化,所以我们进行视口变换,将物体按照屏幕的比例缩放,然后将中心从原点移动到屏幕的中心:
M
v
i
e
w
p
o
r
t
=
[
w
i
d
t
h
2
0
0
w
i
d
t
h
2
0
h
e
i
g
e
t
2
0
h
e
i
g
e
t
2
0
0
1
0
0
0
0
1
]
M_{viewport}=\begin{bmatrix} \frac{width}{2} & 0 & 0&\frac{width}{2} \\ 0 &\frac{heiget}{2} &0& \frac{heiget}{2} \\0&0&1& 0\\0 & 0 &0& 1\end{bmatrix}\quad
Mviewport=⎣⎢⎢⎡2width00002heiget0000102width2heiget01⎦⎥⎥⎤
通常我们的得到的模型是由点组成的,根据不同的拓扑属性,把这些点组合成模型,比如我们可以规定这些点按照顺序组成三角形,四边形还是五边形,可以得到不同的图案。在图形学中,我们最常使用的基本的拓扑是三角形
三角形的优点:
三角形是最简单的多边形
任何多边形可以拆成三角形
三角形一定是平面
三角形的内外分辨的很清晰
定义三个顶点的不同属性,可以通过插值得到三角形内的任意点的属性
由三角形组成的模型,在呈像的时候要变为像素点显示出来,把顶点打散成像素的过程叫做光栅化
采样
想要呈像就要用屏幕上像素的点采样图形,就是用像素来表示图形,要判断有多少像素点在图形内,这一步要做的就是找到在图形中的点(记得用像素的中心点)。ps:有点在边上,或者图形包含一个像素多少才算在内,这种细节可以自己规定。
叉乘判断内外
基本的的图形是三角形,三角形可以用叉乘的方式来判断一个点在三角形内还是三角形外。假设三个点A,B,C,规定顺时针或者逆时针方向,ABxBC和BCxCA的结果是同号的。我们找一个点P,计算PAxAB,然后PBxBC,PCxCA结果如果是同号的话,说明P在三角形内,否则在图形外。
包围盒
之前的笔记中有记过包围盒,包围盒就像是预计算,提前把大概的范围划分出来,可以减少计算次数。个人感觉有很多方法可以加速计算,比如可以提前把一些位置信息存储,就可以直接找到三角形,用空间换时间,每个新的算法都是做 trade-off,针对不同的情况会有不同的解决思路。
Tips
前面说假设像素是一个均匀填充的小方块,实际上并不是
三星的手机显示的像素的排列叫bayer pattern,绿色的点比红色和蓝色的多,人眼对绿色的点更敏感一些
采样原理
采样相当于要用屏幕上离散的点去表示图形连续的点,这里要涉及到频域和时域(图像在空间上的分布也算)的概念和信号处理方面的知识(自行学习)。
傅里叶级数展开,傅里叶变化
任何一个周期函数都可以用一系列正弦函数,余弦函数的线性组合加一个常数组成来表示。可以用傅里叶级数将任意一个周期函数展开成不同的频率的组合。
傅里叶变化可以将图片在时域和频域之间进行转化。在图片上的像素变化,变化越大,转化到频域之后信号越高频,这个变换会默认图片是周期性函数,所以会认为图片的左右和上下是重复的,导致图片边界有高频信号。在转化成频率之后,采样的频率慢,采样一次的时间,可能会发生多次的信号变化,就会导致图像的走样。采样相当于在重复频谱,采样慢会导致频谱密集,频谱之间间隔小,可能会重叠。
走样(Aliasing)
当采样出现错误的情况,我们就称之为走样,
锯齿(Jaggies)
之前采样的时候,我们会判断中心在不在三角形里,在图形中的小方格用红色填满,当格子太大(采样频率低)的时候就会出现下图的情况,这种情况称为锯齿。
摩尔纹(Moire)
Wagon wheel effect
以上三种都是走样的例子。由于信号变化快,而采样的频率跟不上。
反走样
可以用滤波器去掉一些高频信息,反应在图片上就是像素变化不明显,被模糊了。在图片上做卷积,就是低频滤波器的一种。(在时域做卷积相当于转化成频域做乘积再转换回来)
(同时应用高低频滤波器可以剩下中间的部分边界信息)
方法
ssaa
超级采样,就是用4x4的点求平均,输出2x2的图
mass
ssaa是对所有点做平均,mass只对图形边界的点做,比ssaa快很多。
fxaa
在图像边界做图像处理
taa
在时间上前后帧采样
超分辨率 dlss
利用深度学习,补全图像
深度缓存
物体绘制有先后顺序,后绘制离自己近的(画家算法)。深度缓存计算深度值,后来的物体离相机更近的话就抛弃当前值。(无法用于半透明物体)
重心坐标
之前应该提到过,当点在三角形内的时候,它的颜色值可以由三个顶点的值做插值得到,假设中心坐标为a,b,c,有(2d):
p
=
a
∗
p
1
+
b
∗
p
2
+
c
∗
p
3
p=a*p_1+b*p_2+c*p_3
p=a∗p1+b∗p2+c∗p3
a
+
b
+
c
=
1
a+b+c=1
a+b+c=1p有x,y两个轴都满足方程,3个方程直接联立解方程组:
a
=
(
p
−
p
3
)
×
(
p
2
−
p
3
)
(
p
1
−
p
3
)
×
(
p
2
−
p
3
)
a=\frac{(p-p_3)×(p_2-p_3)}{(p_1-p_3)×(p_2-p_3)}
a=(p1−p3)×(p2−p3)(p−p3)×(p2−p3)
b
=
(
p
−
p
3
)
×
(
p
1
−
p
3
)
(
p
2
−
p
3
)
×
(
p
1
−
p
3
)
b=\frac{(p-p_3)×(p_1-p_3)}{(p_2-p_3)×(p_1-p_3)}
b=(p2−p3)×(p1−p3)(p−p3)×(p1−p3)
c
=
1
−
a
−
b
c=1-a-b
c=1−a−b
还有注意cv输出图像向量顺序 gbr。