经过变换之后,不管是正交投影还是透视投影,都被变换成[-1,1]的立方体,接下来就是要绘制在屏幕上,叫做光栅化
1.相机的可视面,宽高,可以得到长宽比
2.FOV(field of view视场角),根据垂直可视角度fovY和长宽比可以得到水平可视角度fovX
1.右边是视椎的近平面,点(1,t,n)与z轴的夹角是fovY/2
2.t是z的值,b是-t,近平面的高就是2t,r就是x的值,l是-r,近平面的宽就是2r
3.于是可以得到右边两个等式
1.左下角是原点,每个像素用(x,y)整数表示,图中蓝色像素是(2,1)
2.像素的宽高是1,像素的中心是(x+0.5,y+0.5)
3.屏幕的范围是从(0,0)到(width,height)
1.忽略z,实质还是一次平移加一次缩放
2.因为MVP得到的是中心在原点,所以要先平移,让左下角位于原点,然后把x和y拉伸到屏幕的大小
不管是二维还是三维,图形都可以分解成一定数量的三角形
1.实质就是判断点否在三角形内
2.定义一个函数inside(tri,x,y)来输出是否在三角形内,然后遍历整个屏幕中的像素
1.利用向量的叉乘,p2p0 x p2q,p0p1 x p0q,p1p2 x p1q三个结果如果是同号的,则在三角形内,否则在三角形外
在边缘上的点再不同情况下可以算也可以不算.
1.将三角形包围在内的矩形叫做bounding box
2.p1,p2,p3中取maxX和maxY,就得到一个优化后的bounding box,可以提高效率,除此之外还有很多优化方案
三角形光栅化之后,由于像素点本事有大小,因此就会产生锯齿(Aliasing)
锯齿产生的原因是采样率的问题,采样的概念在图片,视频.音频中通用,低采样率可以降低质量,加快处理速度,但是会产生走样(Artifacts),锯齿便是其中一种情况.
显示器会在刷新的时候隔行刷新,例如第一帧刷新奇数行第二帧刷新偶数行,以此提高效率,但是会在一定程度上造成走样,或者叫做瑕疵.
上图中叫做摩尔纹,是采样的时候,为了降低质量去除奇数行或者偶数行像素产生的.
信号变换的太快以至于采样的速度很不上,就造成了Artifacts
先对场景,或者说信号进行模糊(滤波)处理,然后再采样,可以在一定程度上反走样
注意如果先采样,再做模糊是达不到效果的
图二中:
同样的采样频率,信号频率越快,就越会走样,上面的根据采样可以大概的还原出信号函数,但是下面的已经完全不能还原了
图三中:
在蓝色函数中进行采样,采样之后还原,还原出来的是显然只能是黑色函数,和原本的蓝色已经差的太远;也可以理解成,用同样的采样频率去采样两种频率的信号,结果却完全相同
傅里叶变换可以把时域变成频域:
1.左边的图像,叫做时域,右边的图叫做频域,是左边的图经过傅里叶变换生成的
2.右边图像的信息由亮度在不同的位置表示出来,外围的是高频,中心的是低频
3.水平和数值的十字高亮,是因为图片不是重复信号,没有时间信息,因此处理的时候会把图片进行平铺,一张接一张,当图像切换边界的时候,会产生剧烈的变化,从高频到低频全部都产生了变化,就出现了十字高亮
去除低频信息:
1.将右边的中心低频信息抹去,逆傅里叶变换,从右向左重新生成图片,叫做高通滤波,也就是只有高频信息可以通过
2.由此可见,只剩下边缘,或者说边界,就是颜色和纹理等等细节发生剧烈变化的时候,就对应着高频的信息.
去除高频信息:
1.低通滤波,图像的边界已经看不到了,只剩下色块表示的低频信息
选择性的去除不同的频率区域:
1.产生不同的效果,图一去除了最低频的色块和高频的边缘,图二去除了大量低频的色块,和高频的信息,通过这种控制,可以得到不同程度的细节信息
卷积Convolution:
1.首先是一个一维的信号,方便理解
2.然后是一个过滤器,过滤器从左向右移动,每次移动一个单位,移动之后计算过滤器中心对应的信号值,计算加权平均值,然后写入采样,最终得到一个采样结果
3.卷积就是模糊操作
1.把信号(图)用滤波器做卷积(图变成另一张)
2.上一步等效于,把图通过傅里叶变换,生成频域,再把滤波器也傅里叶变换,两者相乘,最后再逆傅里叶变换,就得到了和1相同的另一张图
低通滤波器:
1.每个像素周围八个像素都乘1,再加起来,然后除上9
2.这个box越大,图像越模糊,如果是最小的box,则相当于没做滤波,图像就没变化
3.上图两个盒子,是时域图像,也就是黑白色块,右边频域图
先模糊后采样:
1.图一是冲击函数,让信号函数乘上冲击函数,得到一堆的点,也就是ac=e.
2.现在把a变成频域,也就是b,采样的滤波器,频域是d,然后bd=f;根据时域的卷积等于频域上的乘积,得到e和f是等效的,由此可见,采样就是重复原始信号的频谱(复制b中的三角形)
3.图二中,采样率不足,复制频谱的时候,间隔很小,产生堆叠,这就是走样的本质
4.图三中,对原始信号进行模糊(卷积),砍掉高频信号,也就是倾斜度高的部分,于是就不在发生堆叠
MSAA抗锯齿:
把一个像素点细分成4个,甚至16个,通过三角形覆盖的点个数,取一个百分比,占三个就是75%,占一个就是25%
FXAA:采样生成图片之后,通过图像处理,把锯齿给替换掉,效率很高
TAA:把MSAA的样本分布在时间上,复用前面帧的处理
DLSS:深度学习超采样(超分辨率),50x50的图片放到200x200需要补充像素,因此功能就是放大图片
后画的东西会覆盖先画的东西,计算机绘制沿用画家算法的时候也是这么做的,远近或者说遮挡关系,叫做深度关系
一种互相遮挡的情况,画家算法无法解决这种场景.
深度缓存算法:
1.前面说到三个互相遮挡的三角形,无法确定深度关系,所以换个角度,去确定每个像素的深度,生成渲染后的图片的同时,也生成一张用于保存每个像素深度信息的图
1.左边是渲染后图
2.右边是深度图,离相机越近的点,颜色越黑
3.假设首先只有地板,地板的深度图是近黑远白,现在添加一个图中的镂空立方体进去,像素点a原本显示的地板有一个深度x,现在点a也同时处在立方体上,立方体给了a另一个深度y,根据x和y就可以决定地板和立方体的遮挡关系
1.首先将场景分解成一定数量的三角形
2.将三角形全部光栅化
3.一开始所有的像素深度缓存值是无限大,也就是最远,遍历所有三角形的所有像素,然后和深度图的所有像素点对比,如果深度比像素存储的深度要小,说明应该要覆盖原来的像素,就把深度重新写到这个像素中.
4.这个算法与顺序无关,也没有做排序,只是在记录一个最小值,大的值不做任何处理,因此复杂度仅为O(n)
1.R代表无限大
2.5比R小,则重新写入
3.加入第二个三角形,跟R和5相比,比5大要被原来的三角形遮挡,比5小的会遮挡原来的三角形
4.这两个三角形插入到了一起,互相遮挡一部分