文章目录
一些定义
屏幕
- 二维数组, 每个元素是像素 像素可以用RGB三个来表示, 每个像素默认是一致的, 不会变化
光栅
- Roster == screen 德语里含义是一致的, 所以光栅化就是把物体弄到屏幕的过程
屏幕空间
- 在屏幕建立一个坐标系,左下角为原点
每个像素都可以用一个整数坐标来表示, 范围是(0, 0) 到(width -1, height -1)
像素中心在坐标 +0.5的位置上
正交投影到屏幕
- 之前正交投影的时候会把它映射到一个[-1 1] 范围内的正方体, 现在把它变到屏幕范围内
- 先将其拉伸到height, width, 然后平移, 注意这里z方向没有任何改变, 因为和z没有关系
三角形光栅化
- 三角形是怎么得到的呢? 这个还不太清楚
- 三角形有很多好处, 比如它是最基本的多边形, 三角形内部一定是平面的, 三角形内外很清晰
- 三角形内部容易插值
判断像素和三角形的位置关系
-
更确切来说是考虑像素中心点和三角形的位置关系, 通过 采样 的方法解决
-
采样就可以简单理解说现在有一个函数它是连续的, 然后在不同的离散位置询问函数的值, 下面这个小循环就是采样:
- 这里说的采样主要是利用像素中心对屏幕进行采样, 也就是输入是离散的像素中心, 得到对应像素中心位置的像素值
问题定义
现在就是给定三角形, 判断像素中心是否在三角形内
假如在的话我的像素值就会改变, 不在就不变, 就可以在屏幕上显示一个三角形了
- 用1表示在, 0表示不在, 简单表达如下:
inside 函数是什么
- 之前的时候提到其实叉乘就可以判断一个点是不是在三角形内
比如现在有一点Q, P1P2和P1Q叉乘, 可以知道Q是在P1P2的左侧还是右侧, 也可以判断 P0P1和P0Q 的关系
总结一下
考虑一个三角形, 把它的三个点规定顺序, 比如ABC 或者 P0 P1 P2, 按顺序重复判断与点的关系, 比如AB与AQ, BC与BQ, CA与CQ, 得出的结果要么全是正的,要么全是负的, 在这种情况下才可以判断是在三角形内或者外
三角形边界的处理
- 就是假如像素中心在三角形边界上, 那么不对其进行处理
三角形包围盒
就比如给你三个点, 取最小最大X, 最小最大Y可以得到一个方形的区域
每一行也可以找个box
目前存在问题(Aliasing 走样)
锯齿
假如按现在的做法, 会出现严重的锯齿, jaggies! , 这是空间采样产生的问题
摩尔纹
比如一张图片你去掉奇数行和列, 会出现一些纹纹, 这是下采样造成的问题
车轮效应
比如你盯着车看, 看着看着轮子方向不一样了, 时间采样的问题
### 一些解决方法
- 预处理滤波使其模糊
用这个模糊的三角形去处理, 得到的像素也有些渐变了, 但是先采样再模糊就不行
问题剖析
- 为什么下采样带来了aliasing? 为什么采样速度跟不上信号变化速度会有走样?
- 为什么模糊之后再采样效果就变好了呢?
为了解决这些问题需要一点傅里叶的知识
频域 (Frequency Domain)
这里的频率是1和2 , 下面展示一下傅里叶的分解, 用正弦波近似代替一个正方形的波
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9hKKM2y-1639011814074)(typora_pic/image-20211205195156934.png)]
- 首先有一个正方形的波, 然后把一个正弦波向上提A/2 , 就有些近似了
可以越加越多
- 这里粗略的把从时域变到频域的变换叫做傅里叶变换 , 变回来叫傅里叶逆变换
- 因为信号可以变换成一系列频率的组合, 采样的时候采样频率过低就会丢失一些高频信息
走样的比较正式的定义
上图是两种不同的频率, 蓝色的频率高, 黑色的频率低, 假如你的采样频率对两种信号的采样都是一样的, 也就是说无法区分两者, 那应该就是走样 aliases, 好像是混叠吧比较正式的术语
滤波
看下面这张图, 本身的图代表的是时域的信息, 然后变换到频率后中间的是低频信息, 周围的是高频信息, 越亮代表包含的信息越多. 可以看到这里低频的信息很多, 高频的信息比较稀疏
- 这个图中间有两条白线,这是啥呢, 就是说假设图片是周期信号, 也就是它到了右边界再从左边界重复, 这样摆在一起的时候左右会有截然不同的变化, 也就是一个阶跃信号,这个在不同的频域都有 (是阶跃信号还是高频信号不太懂) 所以有一条贯穿的白线
保留高频信息
- 过滤低频信号, 可以看到低频的变成个黑的了, 右边的图再逆傅里叶变换, 就得到了左边的图, 会发现它的高频还是有些意义的, 像是人的边界, 这个滤波器也就是高通滤波
- 为啥高频信息会对应边界呢? 可以这样理解, 边界本身的像素和周围是有很大区别的, 是变化很剧烈的, 所以对应的频域就是很高的
保留低频信息
会发现这张图变模糊了, 这是因为通过这个低通滤波器之后再没有边界的东西了
保留中频段的信息
有一些类似边界的信息
留下的频率更高
滤波又等于平均又等于卷积
下面是滑动窗口的卷积
-
时域的卷积对应频域的相乘, 时域上乘积对应频域上卷积
-
下面用个例子理解卷积:
比如每个像素让其变为周围9个像素的平均, 这个卷积的过程可以是下面的操作, 也就是先变换到频域, 然后频域相乘, 再逆变回去
这里乘1/9是为了防止图像亮度变化, 还发现滤波器基本是低频信息
- 假如这样一个滤波器时域上变化对应的频域怎么变呢
左边是一个滤波器, 右边是频域的表达, 假如时域变大了的话, 那么对应频域也变小了, 很好理解, 假如你取平均的卷积核越大, 那么相应丢失的信息越多
采样
-
图形中的采样其实就是屏幕上有很多像素, 正常来说显示应该是连续的, 但是我只要对应像素点的值, 所以是离散的采样
-
下图是一个采样的过程, 原先我有一个信号 ,然后我用冲激函数去和它相乘采样, 对应是频域的卷积, 会发现所谓的采样其实就是频域的复制
采样频率太低就会出现频谱的混叠
反走样
-
当然最根本的是提高采样频率, 在图像中来说就是把屏幕分辨率调大, 像素多了采样点密集自然采样频率就大了, 这是物理解决方法
-
之前提出的方法是先做模糊后做采样
-
模糊其实就是低通滤波, 把高频的信号过滤了, 然后再采样就会降低混叠的程度
-
为什么先采样再模糊不行呢? 因为采样完已经产生混叠了, 再模糊也没啥用了
-
那么怎么把三角形变模糊呢?像是下图中的。 其实很简单,就是用一定大小的卷积操作就可以了, 等价于一个低通滤波器
其实这里的卷积核就是一个像素而已
看下面的图假如你的三角形覆盖了1/8的位置, 那么我这个像素的颜色就是你覆盖的加上没覆盖的平均
实际中的反走样操作
- 现在是需要求一个像素覆盖或者没覆盖的平均
MSAA
用更多的采样点进行反走样
基本思想是认为一个像素被划分成了好多小的像素, 比如下面一个像素被分成了16份, 每个小的像素又有一个中心
再比如下面的例子:
你比如说看下面这个像素:
它有三个点在三角形内部所以可以估计三角形覆盖了这个像素75%的内容
这样最后会得到下面的结果, 也就是模糊操作完成并进行了采样:
当然实际过程中有很多复用, 不是完全这个样子的
介绍两种抗锯齿方法
-
FXAA (Fast Approximate AA) 先得到有锯齿的图,然后进行后处理, 具体是找到有锯齿的边界然后换成没有锯齿的
-
TAA (Temporal AA) 用上一帧的信息辅助处理
-
还有一个很相似的是Super resolution (超分辨率), 把小图拉大, 使用DLSS (Deep Learning Super Sampling)