定义透视投影视锥两概念:长宽比、垂直的可视角度
知道这两个规则后,一个视锥的所有数值都能相互转换
- MVP矩阵
模型(Model)、观察(View)、观察(Projection)
局部坐标(局部空间) → 世界坐标 → 观察坐标 → 裁剪坐标 →屏幕坐标
物体的储存是依赖于自身的坐标系的,如果要将物体摆放在世界坐标上,就要将物体的坐标转换到世界的坐标上,这就是局部坐标到世界坐标的转换,具体如下:
矩阵缩放——物体模型大小在世界坐标中不一定是原来建模时的尺寸,要按照新建规矩来调整
矩阵旋转——和缩放一样是依照模型原点为中心的
矩阵平移——将物体坐标系与世界坐标系对齐
以上顺序不能改变
除了这两个矩阵,还有一个重要的矩阵是视图矩阵,粗糙地说就是摄像机矩阵,是以观察者为原点的
首先是构造世界相机,规定正对方向g,向上方向t,再构造相机坐标系(t×-g),t,-g,也可以说是u,v,w基向量,v向上,方向为w的负向(向上方向未知,其实可以先随便设置,算出叉积后再反过来叉积得出向上向量)
相机显示出来物体是什么位置,这个时候需要依靠世界坐标和物体坐标的关系,以及世界坐标和相机坐标的关系来计算出相机与物体的关系
我们不妨这样想:假如世界坐标就是相机坐标,那么现在物体在世界坐标上的位置是已知的,这个位置其实就是需要传给相机的关键信息。那么现在开始将相机坐标系与物体绑定做运动,也就是说物体对于相机来说是不动的,然后将相机移动到原来的需要求的位置上,再将物体移动回去,这样的话整个相机和物体的任何数值都是没变的。有没有发现关键点,那就是在这整个“从未知到已知”的过程中,从相机视角上看就只是“物体本身发生了相机移动的逆运动”。那么这样思路就很清晰了,计算出物体在相机上的位置其实就是把相机移动的逆矩阵乘以物体的世界坐标。又由正交矩阵的逆就是它的转制这个定理,其实就是将相机坐标的转至乘以物体坐标得来。
这就是将世界坐标转换到观察坐标
然后到裁剪坐标这一步,这个上一篇已经讲过,其实就是在规定相机的眼睛大小,能看到多少地方,然后将这些“地方”按照一定的规矩展示出来,也就是正交变换或者投影变换
接下来是显示在屏幕上的一些规矩
光栅化
无论是正交还是透视投影,最终都要转换到[-1,1]的三次方矩阵上,转换后要将这个矩阵在屏幕中显示
首先定义一下屏幕(光栅成像设备)数据:
- 一个二维数组(数组中元素是像素)
- 屏幕大小(分辨率)——像素多少
- 光栅化的类型
光栅化:将图片展示在屏幕上
像素:抽象理解——一个个内部颜色分别一致的单位,不同像素颜色也许不同
假如说屏幕是一个xy轴,现在有width个x轴上的像素,height个y轴上的像素,那么光栅化的第一步就是将[-1,1]矩阵乘以这样一个数值将它拉到这么屏幕上
这也是视口变换的一步
然后就是将这个物体的二维形态“打散成像素”
选择三角形作为基本图形的原因:
- 图形最为简单
- 确定的三角形肯定在一个平面之内,内部外部定义非常清楚
采样法
for(int x=0;x<xmax;++x)
for(int y=0;y<ymax;++y)
image[x][y]=inside(tri,x+0.5,y+0.5);
"判断是否在三角形内":首先规定三角形的三边方向,然后分别用三边和点进行叉积
采样带来的问题
- 锯齿——空间采样
- 摩尔纹——图片质量问题
- 车轮倒转效应——时间采样
信号变化太快导致采样速度更不上变化速度
走样定义:采样两种完全不一样的函数,得到的确实一个同样的结果
滤波:把某特定频段去除
首先,先了解一下一张彩色图片的像素成分
从0~255,从黑色到白色,这个叫做像素灰度
为不同灰度像素赋予颜色,就获得了颜色深度不同的色块,彩色图片比灰色图片多一个维度,也就是颜色的不同,一般的彩色图片都由三原色构成,也就是常说的RGB三原色,深度为3(不过过多了就不涉及了)
图像的频率,正是图片某段灰度变化剧烈的指标
一般图片在什么地方灰度变化剧烈呢?那肯定就是图形边缘的部分了,这部分又恰好是锯齿化最为严重的部分
反走样
增加采样率——负担过高,受制于物理限制,不现实
抗锯齿——模糊化后再进行采样
模糊操作:
根据每个像素中三角形的覆盖面积来求平均值,最终结果作为本像素的统一颜色(这就是卷积操作)
MSAA:在像素内增加几个采样点,这几个采样点是为单个像素本身来服务的,而不是单纯为了增加采样点。像素内的多出来的像素点用于计算边界覆盖面积平均值,比如像素点内部有四个采样点(4x),其中一个采样点被覆盖,那么这个像素点的覆盖率就是25%,理应计算25%的颜色平均值。
FXAA:快速近似抗锯齿,后处理,形变抗锯齿,注重性能,和采样无关在图像层面上进行操作
TAA:时间相关抗锯齿,静止物体上,多次采样求平均分摊到多帧
超分辨率
DLSS:深度学习方法——将一个小图拉大,会出现锯齿,这个时候用计算机“猜出来”,适用于深度学习方法