05 Rasterization 光栅化#
field - of - view (fovY) and aspect ratio
Aspect ratio = width/ height
Aspect ratio代表从摄像机所看到的范围平面的长高比(近平面的长宽比)
取可视范围平面上下两个边的中点, 这两个中点和摄像机起点连接, 所形成的夹角就是fovY, fovY越大, 夹角越大, 可视平面高越大, 看到的内容越多
可视角度fov有三种, 水平, 垂直, 对角线可视角度, 分别对应左右, 上下, 对角最边缘两点之间的夹角
计算机图形学中的透视投影是建立在小孔相机模型基础上的, 在这基础上, 你可以把摄像机和近平面的距离理解为焦距
焦距n和fovY可以相互转换, 且相互影响, 一方变动, 另一方也会变动. 它们影响的成像因素不同, 但都影响最终成像
焦距越大, Fov越小, 长焦效果, 远且清晰
焦距越小, Fov越大, 广角效果, 内容多
什么是屏幕#
二维数组, 每个元素代表一个像素, 尺寸代表分辨率, 是光栅成像设备, 把东西画在屏幕上, 就是光栅化的过程
pixel - picture element, 像素, 现在理解成一个个小方块, 颜色由rgb三个值决定
像素标签是(x,y)形式, 从(0,0) 到 (width - 1, height - 1), 像素中心点为 (x + 0.5, y + 0.5), 屏幕覆盖范围为(0,0) to (width, height)
视口变换#
把上节课提到的-1,1立方体通过矩阵变换成屏幕尺寸[0, width]x[0, height]
光栅化#
把三角形打碎成像素
#
早期显示器通过将电子打到显示器的方式来显示画面
从左上角开始一行一行打电子, 最终组成画面
隔行扫描
分奇数行和偶数行, 第一帧打奇数行, 第二帧打偶数行. 利用人眼暂留效应, 效率翻倍, 但有画面撕裂问题
现在是通过读取显存的信息来呈现图像, 图像信息被存在不同的显存区域
lcd显示器(手机), 视网膜屏幕(分辨率大于人类视网膜)
lcd是液晶显示器
用液晶控制光是否通过, 用液晶控制光的方向, 只有水平方向的光才能通过, 才能进入下一层调整颜色, 通过的光统一为白色. 液晶未开启, 光是垂直方向, 无法进入下一层, 这个像素就显示黑色
LED 发光二极管
发光或不发光
墨水屏
通过电压翻转黑白墨水的位置来显示, 刷新率很低, 优点是自然
三角形是最基础的图像
三角形可以组成任何图像
三角形内部一定是平面
三角形内部外部定义明确
三角形方便做线性差值
采样
函数离散化过程就是采样, 给不同x, 求不同f(x)值. 课程说的采样是利用像素中心对屏幕空间进行采样
屏幕有个三角形, 要判断像素中心是否在三角形内
定义一个函数, 输入任意像素中心坐标, 三角形, 输出1,0 判断是否在三角形t内
屏幕历遍代码
函数内容
通过叉乘判断点是否在三角形内 假设三角形p1,p2,p3. 一个额外点Q, 假设向量p1p2和p1Q, 向量叉乘, 从结果正负判断Q的位置在左侧还是右侧, 循环3次, 三次结果相同(三次都为正, 或者三次都为负)就在三角形内, 反之在外
在三角形边界的点, 要么不处理, 要么特殊处理. 特殊处理就是自定义标准, 直接判定为内或外. 不同图形api判定不同
没必要历遍所有像素来判断三角形, 先判定三角形的BoundingBox包围盒. 三角形的三个点, 取最大和最小的xy值来构成BoundingBox. 这样就不用历遍屏幕所有点
另一种处理方法, 取三角形每一行最左和最右的像素中心位置, 取最小最大xy值来构建多个小的BoundingBox来历遍三角形的所有像素. 这个方法适合狭长的三角形(比如因旋转变得狭长)
实际LCD屏幕像素
iPhone6S像素是三个RGB条, GalaxyS5 是红绿蓝三个点状图案, 这种被称为 bayer pattern. 绿色分布比红蓝多, 因为人眼对绿色敏感, 绿色对人眼更好
下节课解决锯齿, 反走样
06 光栅化 part2#
aliasing 锯齿, 走样
antealiasing 反走样
artifacts 错误, 不准确, 一切看上去不太对的东西都叫artifacts
锯齿, 摩尔纹都是artifacts, 都是采样带来的问题, 空间, 位置采样
人眼采样速度跟不上运动速度, 会出现像轮胎旋转, 但看起来像逆方向旋转的问题, 车轮效应, 时间采样
信号变化速度太快, 采样速度跟不上.
采样前做模糊, 然后再采样, 这是一种抗锯齿方法. 先采样再模糊不行 Antialiasing vs Blurred Aliasing
But why?
为什么采样速度跟不上信号变化速度就会有走样 为什么先模糊再采样和先采样再模糊两者不同
这关系到频率Frequency Domain这个概念
正弦波余弦波, 频率f代表变化速度, 越大越快(短时间内循环次数). 周期代表每个多少函数重复一次
傅里叶级数展开
任何一个函数都可以写成正弦余弦函数的线性组合以及一个常数项. 比如图例的黑色函数分解成正弦余弦函数, 可以用更多余弦项来让函数结果更接近最终要的原始函数. 通过傅里叶级数展开, 可以把一个函数转换成多个正弦余弦项和一个常数项的和
傅里叶变换
给定任何一个函数, 通过复杂的操作可以变换成另一个函数, 通过一个逆变换还可以变回去, 这个变换叫做傅里叶变换和傅里叶逆变换
任何一个函数, 都可以分解成频率从低到高的一个形式
同样的采样数, 采样不同频率的函数, 频率越高的函数, 采样准确度越低, 恢复出来的结果和原函数差别巨大. 因此采样和函数频率有关
同样的采样方法, 对不同函数进行采样, 得到的结果有时会完全一样, 这就叫做走样, 无法区分两个不同的函数
所谓滤波, 从频率的角度来讲, 就是把特定频率给抹掉
可以把图形通过傅里叶变换, 从图像变换成频率空间. 频率图中心为低频, 四周为高频, 中间亮, 代表信息集中在低频区域
频率空间会看到两条线, 这是当图片不是无缝图片时会出现, 因为边界不是无缝的, 会有剧烈变化, 在频率图就会出现两条线, 这个图被称为频谱
滤波是去掉一些频率的内容
high-pass filter(edge)就是去掉低频信息, 留下高频信息, 一般留下的部分是图像中元素的边界
low-pass filter(blue)抹掉高频信息, 相当于去掉边界, 就会看上去边界模糊
滤波等于平均, 又等于卷积, 模糊就是平均操作, 卷积可以这么理解, 原信号是一个数组, filter是比原数组元素更少的数组, 要填满这个数组, 需要从原输出获取元素, 比如第一格元素是由原数组的1/4第一格, 1/2第二格, 1/4第三格, 三个数的和组成的, 相当于各取一部分, 得到最后的结果, 这个过程就是卷积. 在原始信号取三个相邻的数, 做个加权平均, 最后得到新的信号
卷积本质是固定的权重模板,从输入取值, 每个值有不同权重, 结果之和为最终输出. 卷积频谱代表的是组成输出的元素而不是输出的结果
时域上,对两个信号进行卷积, 就是对两个信号在频率上进行乘积
你可以直接对图片进行卷积操作, 结果会是模糊滤镜效果. 把图片转换成频谱再引用卷积, 结果用傅里叶变换转换成图片,结果和前者是一样的, 这意味着卷积可以用在频谱, 也可以用在图片上. 图片的卷积是像素卷积, 频谱需要把卷积盒转换成频谱, 原频谱和卷积频谱相乘得到最后的频谱, 也就是我们最后得到的图片, 时域卷积等价于频域相乘, 这是由傅里叶变换的数学性质决定的
卷积核(3x3boxfilter)采样9个像素, 根据权重相加, 再归一化(不归一化会越加越亮)
冲击函数, 只在固定位置有值, 其他位置没值.
采样就是一个原始信号a, 乘以一个冲击函数, 结果就是采样结果, 这是时域采样
频域是b卷积d, 就是对原信号频谱进行复制粘贴的操作. 所以采样就是在重复原始信号的频谱
走样就是采样不够快, 在频谱就是复制粘贴的间隔过小, 在这层关系上时域和频域相反.
频谱复制粘贴后出现混合, 就会产生走样
反走样#
增加采样率, 频率(分辨率), 但这不是反走样. 因为受制于物理限制
先对原始信号进行模糊, 去掉高频信号, 再以原本的采样率来采样, 就不会出现频率混合.
根据三角形对像素的覆盖面积, 来决定这个像素的亮度, 比如覆盖一半, 就只有一半亮度. 对像素内部的值(黑白比值)进行平均, 就是卷积操作
MSAA multi simple antialiasing 用更多采样点来反走样
对任何一个像素进行划分, 划分成多个小像素, 比如一个像素划分成4x4的小像素, 每个小像素都有中心点, 判断点是否再在三角形内, 再对结果进行平均. 根据三角形对这个像素的覆盖面积来输出最终的颜色. 通过这样的方法来实现抗锯齿的效果
MSAA最后的结果就是模糊再采样的结果
MSAA cost#
增大了计算量
现实中通过比较少的采样点, 或是用不同的采样图案划分(并不是把一个像素划分成规则的4x4小采样点, 而是特殊图案), 配合复用临近采样点(样本复用)来实现抗锯齿
FXAA和TAA, 另外两种抗锯齿, 除了MSAA外最常用的两种抗锯齿
FXAA Fast Approximate AA 快速近似抗锯齿. 图像后处理 把图片锯齿边界找到, 替换成无锯齿的边界, 和采样无关(并不是先采样再模糊)
TAA Temporal AA 复用上一帧感知的结果. 不像MSAA那样增加采样点, 而是在时间上进行卷积, 即便是一个静止的物体, 每一帧采样的位置都会根据偏移值有所差别(半个像素距离), 最后通过把所有帧的采样结果进行一个平均, 得到最后的结果. 有动态模糊(快速运动物体历史帧采样点无法精准对齐造成拖影)和重影(一个东西突然出现再消失, 会有历史帧残留导致错误复用出现残影)问题
Super resolution 超分辨率
512x512拉大到1024x1024 同时避免锯齿
DLSS 通过深度学习, 把拉大造成的细节缺失猜出来