光栅化

屏幕

屏幕的定义
一个二维的矩阵,由像素点组成,我们暂时认为像素点是最小的单位方块,方块中有着同一个颜色
image

屏幕空间的定义
我们用一个二维坐标系来表示整个屏幕,每个像素都有一个二维坐标
我们给予每个像素单位1的宽度和高度,用像素左下角的坐标来表示一个像素,这样每个像素的坐标都会是整数
\((x,y)\)像素的中心在\((x+0.5, y+0.5)\),屏幕空间就是\((0,0)\)\((width, height)\)覆盖的平面

光栅化

光栅化概述

raster: screen
rasterize: draw onto the screen

我们往往是通过光栅化三角形来得到更复杂的图形
image

三角形的优秀性质:

  1. 最基本的多边形
  2. 其他多边形可以拆成多个三角形
  3. 三角形一定在一个平面上
  4. 三角形的内部和外部分的很清楚
  5. 有好的方法用于在三角形内部插值

三角形的光栅化

在视图变换之后,想要把一个canonical cube,即\([-1,1]^3\)的方块,放到屏幕上,我们先忽略z方向,进行以下操作
1. 把cube的xy平面缩放到width*height
2. 把cube的xy平面左下角放到原点
image

光栅化的重点:
判断像素中心点与三角形的关系,在三角形内部的我们就将像素染色
方法:采样
采样的定义:
将一个函数离散化,也就是通过在函数上取特定的点得到点的函数值

我们在屏幕空间上的采样:
判断每个像素的中心是否在三角形内部,得到一个inside函数,得到每一个像素的值是0还是1
image

这就是对一个三角形光栅化的过程
image

具体判断是否在三角形内部,我们用叉乘的方式来判断
我们从任何一个点开始,按顺序叉乘,先是\(P_1P_2\)叉乘\(P_1Q\),再是\(P_2P_0\)叉乘\(P_2Q\),最后是\(P_0P_1\)叉乘\(P_0Q\),得到的三个结果如果全是正的,或者全是负的,则证明点Q落在三角形内部,否则不是
image

对于落在边上的点,视情况处理

直线的光栅化

对于一条直线的Rasterization有几种常用算法
DDA Algorithm Digital Differential Analyzer
m是直线的斜率

image

但是如果m比较大时,该算法效果不好

image

所以如果m大于1时,我们交换一下x和y的位置,用y来递进

image

Bresenham's Algorithm是更高效的算法,因为DDA每次循环需要一次浮点数运算,而Bresenham只需要整数运算
假设深蓝是我们已经选定了的像素,浅蓝叫做candidata pixels
image

我们对这样两个Candidates计算一个Decision Variable

image

也就是如果d_lower大于d_upper,则选取上面的像素,否则则是下面的
而且p_k+1可以由p_k递进地求出,算法比较高效
image

多边形的光栅化

可以采用line scanning的方法,需要用链表的结构来记录信息
image

还需要判定一个点是在多边形的内部还是外部
如果是convex的就简单,如果是non-convex,可以采用odd-even test或者 winding number method来判断

三角形光栅化的加速

  1. 包围盒bounding box,对边界进行简单判断,取一个矩形,矩形之外的像素不需要光栅化
    image

  2. 逐行判断,对每一行都判断边界,这种方法适用于斜过来而窄长的三角形,Bounding box会太大
    image

真实的光栅化

每个像素点都是三原色组成,在S5中用的是Bayer-Pattern,并不是一个方形
image

反走样

反走样概述

我们的像素点采样,会导致锯齿,需要特殊技巧反走样、抗锯齿
image

aliasing走样
artifact:图形表现中的瑕疵

采样带来的artifact:

  1. 锯齿

  2. 摩尔纹
    image

  3. wagon wheel illusion
    image

前两者是采样在空间上产生的artifact
Wagon whell illusion是在时间上产生的artifact

走样aliasing的正式定义:用同一种方法采样两种函数,得到的结果却一样
如下图,黑色的sin函数是我们对蓝色sin函数采样后进行的拟合。如果我们对黑色的sin函数进行同样方法的采样,得到的结果完全一致,这就是走样
image

aliasing artifact产生的原因:信号变化太快,采样频率太慢

周期函数频率越高,采样的频率也需要更高
如图所示,从上到下函数频率变高,但采样频率一致,则拟合效果越来越差
image

反走样的原理

滤波器

滤波:把特定频率段的信号抹去,下面两张图就是高通滤波和低通滤波的例子。左边为图像,右边是图像的频谱,中心为低频,外围为高频
image

图像内部的边界代表的是剧烈的变化,对应的就是高频信号,所以下图把人物的边界都保留了,而内部信息是低频信息,被抹去
image

低通滤波,边界信息被抹去,得到的图像就显得比较模糊
image

卷积

在频域上我们通过卷积来实现滤波

卷积定理
在时域上的卷积和在频域上的乘积等同
在时域上的乘积和在频域上的卷积等同

下述在时域上的卷积操作和在频域上的乘积操作等同,都相当于做了一个低通滤波
image

我们可以把卷积核用时域上的信号来表示,如左边,右边是卷积核在频域上的表示,卷积核越大,卷积得到的图像就会越模糊,也就是高频信息减少,所以我们可以推出,卷积核越大,卷积核频域上的高频信号越少

采样

采样在频域上的表现:重复频域上的内容
我们用冲激函数(c)来对时域上的信号(a)采样,也就是进行乘法操作,得到结果(e),如果把这个过程用频域来表示,(b)是原始信号,(d)是冲激函数,进行卷积操作,发现采样结果(f)就是重复频域上的内容
image

当采样频率不够高,就会出现下面的问题。采样的频率越低,频谱中周期信号间隔就越小。如果间隔小的以至于产生混叠,就会产生走样问题
image

反走样的方法

方法:

  1. 增加采样率。但同一个显示屏,采样率是保持不变的。显示屏的分辨率就代表了采样率,单位面积内像素更多,代表对图像信息的采样更密集,采样率更高
  2. 在光栅化前进行低通滤波,把图像变模糊,使频域上的原始信号更窄,采样后混叠情况就会减少
    image

MSAA:multi-sampling antialiasing

对反走样的近似,不能严格上解决走样

低通滤波:我们用黑色代表一个像素里被三角形覆盖的部分,白色代表没被覆盖。我们用一个像素大小的滤波器,对每一个像素卷积,得到的结果是这个像素灰度平均值,最后这个像素统一为一个灰度,这个像素的灰度和它原先的的黑色百分比成正比,这样就把黑白色的边界去掉,也就是去除高频信息,把边界模糊
image

如何实现卷积
super sampling:将所有像素划分为更小的部分
2x2 supersampling就是把每个像素分为2x2的划分,对于每个像素,我们判断每一个划分的中心点是否在三角形内,一个像素得到一个inside函数,每个划分的函数值为0或是1,每个像素再取四个划分函数值的平均值,这样我们就得到了每个像素的灰度平均值
image

弊端
增大了计算量,如果是4x4 supersampling那就是16倍计算量
工业上,super sampling并不是规则的划分,划分中心点在像素内的分布不规则,而且存在多个像素复用同个点,提高分辨率的代价降低

FXAA: fast approximate AA

和采样没有关系,先得到带锯齿的光栅化结果,然后通过图像识别找到锯齿,再把锯齿替代掉,十分高效

TAA: temporal AA

如下图,TAA是利用过去帧的信息来给当前帧“增加采样”
比如在第i帧,每个像素都采样格子中的橙色点;第i+1帧,都采样黄色点;...
而且每一帧,像素的结果都和前一帧结果做插值,即可得到TAA
image-20220824204953115

如果物体发生移动,就要将当前像素坐标back projection到前一帧像素坐标,之后的做法如上

可见性

我们要实现存在多个图形互相遮挡的情况的光栅化,需要采用特定算法

Painter's Algorithm画家算法

算法步骤
按照一定的顺序来光栅化多个有遮挡关系的图形
先把最远处的图形光栅化,再光栅化近处的图形,而且近处的图形会遮挡远处的图形
需要O(nlogn)的时间来排序图形的距离
画家算法可以很好的解决二维平面上的光栅化

但画家算法不能解决
image

Z-Buffer深度缓存

Z-Buffer是工业上广泛应用的算法
光栅化时,要同时实时生成和维护两幅图,既要得到渲染结果图,也要得到一个深度图
深度图:每个像素存储这个像素上最浅的图形在该像素上的深度

下图中左为渲染图,右为深度图
我们用较深的颜色来表示较小的深度,较浅的颜色表示较大的深度
image

算法步骤

  1. 初始化深度图,全部深度写为无限大
  2. 遍历每一个要光栅化的三角形,再遍历该三角形覆盖的每个像素,判断该三角形在该像素上的深度,如果比深度图在该位置上的深度小,则更新深度图该位置的深度,并更新渲染图,否则不变
    image

image

假设有n个三角形,每个三角形覆盖c个像素,则Z-Buffer的复杂度是O(n)

Z-Buffer算法和对每个图形光栅化的顺序没有关系

Shadow Mapping

Shadow Mapping方法

Shadow mapping是我们用光栅化方法绘制阴影的方法
关键思想:不在阴影中的点,一定既能被光源看到,也能被摄像机看到

shadow mapping步骤

  1. 把摄像机放在光源处,对整个环境进行光栅化,不用着色,记录能看到的每一个方向的最大深度,得到一张深度图
    image

  2. 把摄像机放回观察处,对整个环境进行光栅化,计算能看到的每一个点,按照从光源到该点的方向,投影回去到光源,找到深度图上的对应像素,既可以重新计算投影路径的长度,也得到之前记录的深度图在该像素的深度。如果长度和深度一致,则该点可见,否则该点在阴影中
    image
    image

Shadow Mapping的局限

shadow mapping会带来一些问题:

  1. 两次路径都是用浮点数记录,浮点数的比较会存在一些问题
  2. 如果深度图分辨率较低,会造成光栅化的阴影存在artifact,如果分辨率较高又会影响性能
  3. 无法绘制soft shadow

点光源得到的阴影我们称为hard shadow,光栅化方法只能绘制hard shadow
而实际生活中的阴影往往是soft shadow,因为光源不是点状的,而是有体积的
一个soft shadow包含本影和半影两部分
本影部分是完全看不到光源,半影部分是能部分看到光源
所以半影的阴影没有本影那么暗
image

下图中上图是hard shadow,下图是soft shadow,soft shadow更符合实际
image

posted @ 2022-01-17 15:18  wcvanvan  阅读(368)  评论(0编辑  收藏  举报