本文是学习 Games下课程现代计算机图形学入门课程后所总结的笔记,主要是记录结论夹杂自己的理解,减少记录推导过程,意在于总结和复习。
games 101 原课程主页
本节是概论,课程的介绍。
本节是线代中向量和矩阵的基础知识,与其在图形学上的应用:
本节主要讲的是二维图形和三维图形的变换(仿射变换 = 线性变换+平移)操作
线性变换:缩放,翻转,切变,绕原点逆时针旋转
齐次坐标:用于将仿射变换(平移和线性变换)都用一个种类型的矩阵表示。
2D point = (x,y,1); 2D vector = (x,y,0);3D point = (x,y,z,1); 3D vector = (x,y,z,0);
逆变换:即是乘变换矩阵的逆矩阵。比如:想做顺时针旋转而非逆时针,那么将乘于R(arfa)的逆矩阵也是其转置矩阵(因为他是正交矩阵)
组合变换与变换的分解:比如:想做非原点的变换,步骤应该是:(1)平移到原点(2)做旋转(3)做第一步平移的逆变换。再比如:3D的过原点任意轴旋转,步骤应该将向量分解成轴方向的旋转和垂直轴方向的旋转,如果是非原点也无非是先平移再旋转再逆平移吧。
3D 旋转:绕x,y,z轴旋转:可以发现绕哪个轴转,那个变换矩阵位置为1,另外的绕x,z轴是,为平面的绕原点逆时针旋转的矩阵;但绕y轴却是,为平面的绕原点顺时针旋转的矩阵(其逆矩阵)。
3D旋转:绕经过原点的任意轴旋转 其证明:(主要思想为变换分解,分解向量为指向任意轴+任意轴与向量的平面内垂直任意轴的方向)
我们实际的世界是3D的,而展现在我们视野里是2D的,本节主要讲3D模型自身变换处理,人的视角变换的处理,3D到2D的变换的处理?即三步:模型变换,视图变换,投影变换。
模型变换(modeling tranformation):将一个物体自身进行变换(缩放、旋转、位移),上一节介绍了此变换方法。
视角变换(view tranformation):根据眼睛(相机)来判断物体的相对位置。定义相机的三要素:相机位置position(向量e),相机面向方向gaze direction(单位向量g),相机上下方向up direction(单位向量t)。为了方便计算,我们应设定相机处于原点(0,0,0),并up direction 指向Y轴方向,gaze direction 指向-Z方向。如此,我们应该先进行相机平移(见下图1);后进行相机的旋转:将单位向量g转到-Z轴方向,将单位向量t转到Y轴方向,那么顺理成章的 gXt即指向X轴方向(见下图2)。在介绍如何变换相机后,根据相对位置的原理:相机做的变换,物体做相同的变换才能保证看到的视图是不变的。因此,其实视角变换仍是为模型变换。
如何方便地得出图二的旋转矩阵,采用逆矩阵思想。
投影变换(projection tranformation):将三维空间内的物体投影至标准二维平面([-1,1]2)之上,这一步才是真正的3D转2D的过程。投影变换分为两种:正交投影(orthographic)和透视投影(perspective)。
正交投影:无论远近,投影大小和实物面大小都一样;理解做法:丢弃z,将xy平面标准二维平面([-1,1]2)之上,方便之后计算;具体做法:先定义一个空间中的长方体(前后f,n;下上b,t;左右l,r),再将整个长方体中心移动到原点,再将其x,y,z均拉伸到[-1,1],达到整个图像处在标准立方体([-1,1]3)之中的效果。
透视投影:近大远小(梗:道理我都懂,但为什么鸽子那么大)。视角方向是一个视锥(由两个元素定义视锥:Vertical Field Of View 垂直可视角度,Aspect Ratio 长宽比[width:height]);其次规定近平面Z(n)[近平面其为照片大小]与远平面Z(f)。【我们通过视锥的定义可以算出远近平面的l,r,b,t,f,n。】
【续】上图呈现的一个Frustum截头椎体,将其远平面压缩成近平面大小,转化成正交投影的长方体。如何理解这步操作:所谓为何近大远小,远平面能看到的视野广阔,而我们视野形成的2D平面是近平面大小,所以将远平面压缩,才造成远处物体缩小。在处理完压缩后,再以正交投影方式处理。
然后我们要讨论如何压缩:压缩要求远近平面的Z不变,而中间平面的Z随压缩而变化,远平面中心在压缩后仍为平面中心。其中问号处为(0,0,n+f,-n*f) ,原课程有推理过程。
光栅化可以理解为计算机如何将图像画在屏幕上,本节在上节进行投影并固定在标准立方体([-1,1]3)之中后,介绍了如何在屏幕上用像素画出原图像。
在没有着色的图形中,在同一个立体呈现同一个颜色时,并没有立体感,看不出分明的棱角。在课程里着色定义为:对应物体应用不同材质,在光线相互作用的下,呈现明暗不同。本节介绍了基本着色模型,着色频率,插值的作用和计算方法以及纹理映射。
Blinn-Phong Reflectance Model(基本着色模型)三种不同的部分:高光,漫反射,环境光照。计算出三部分相加即可【只考虑局部,不考虑阴影】。(0)首先定义光照点(shading point):光照点均看成平面,法线方向n,光照方向l,观测方向v,表面因子(颜色,光亮…)。
(1)漫反射(diffuse):如何计算多么明亮,分析光照点平面接受的光线有效吸收面积(跟法线方向n与光照方向l有关);分析光源点传播到光照点的能量传播衰减(跟光源点与光照点距离r有关);分析观测点,由于漫反射光线均匀反射(跟观测方向v无关)。
(2)镜面反射(specular):高光处取决于光照方向l经过镜面反射方向与观测方向接近。如何具体判断,l与v的角平分线方向h,判断是否h与n接近;p指数为了控制高光范围大小。
(3)环境光照(Ambient):其为间接光照,并假设任何方向来自环境的光是相同的。与光照方向,观测方向均无关,设为一个常数。
着色频率(shading frequencies)三种方式:Flat shading 对每个三角形平面着色;Gouraud shading 对每个三角形顶点着色,三角形中心用插值法平滑过渡;Phong shading 对每个像素点着色。(1)对于Flat shading 很好计算其平面法向量,而另外两种方式呢。(2)Gouraud shading 中如何定义三角形顶点的向量:一种简单的方法是计算与此点有相接的平面的法向量的平均值,更准确的是应该在每个平面法向量*其加权值(其三角形面积)再求平均值。
(3)Phong shading 中如何定义像素点的向量:在知道顶点的法线方向时,用重心坐标计算像素点插值代替三角形内部像素的法线方向。
插值(Interpolation):(1)为什么使用插值:在顶点拥有特殊值,我们希望三角形内的像素点能平滑过渡。(2)插值的应用:插值可以用在任何属性上,包括颜色,法向量,纹理坐标。(3)我们如何插值:重心坐标。首先定义重心坐标:重心坐标是定义在一个三角形上的;在已知三个三角形顶点的情况下,三角形内的任意一个点的坐标均可由三个点的坐标来线性表示(需要满足三个系数为非负,并且相加为1),那么其系数组合即为重心坐标;
其次,如何求一个点的线性坐标:如下图,A顶点对面的分割三角形AA面积在三角形总面积之比。特殊的对于三角形的重心,其分割的三个三角形面积相等,重心坐标为(1/3,1/3,1/3)。
重心坐标的推得求解公式:
最后,如何使用重心坐标:其实就是点的属性=点的重心坐标系数分别乘其三角形顶点的属性求和。
如何将纹理应用在渲染中:
(1)简单纹理映射:对于每个光栅化采样点根据插值计算出其纹理坐标,根据纹理坐标查询像素点对应的颜色,可用作于着色系数。
(2)纹理的处理1:对于纹理本身分辨率太小,造成投影的像素点与纹理的像素点不重合。处理方法:双线性插值(Bilinear interpolation):先找到像素点相邻的四个纹理点,根据两边的两点水平插值出u0,u1的属性值,再讲u0,u1进行垂直插值得到像素点的值。
(3)纹理的处理2:在纹理分辨率对于像素太大,对于透视投影的远处一个像素中需要很多纹理表示,造成走样。处理方法步骤:a.近似正方形的范围查询(Mipmap),提前将纹理生成出多层缩小分辨率的纹理。
b.如何计算出一个像素点所占纹理的范围(即Mipmap的查询范围):一个像素点与相邻像素点的距离为1,将像素点和相邻像素点映射到纹理中,得到的像素点映与相邻像素点映射之间的距离计算出,取最大值近似作为像素块长度1在纹理中的长度L。查询的区域level D = log2(L),就是用比L X L 一样的一个mipmap生成图。
c.如果D为非整数的处理方法:使用三线性插值插值,先在ceil(D)和floor(D)的mipmap生成图分别做双线性插值求出其值,再将两个值再做一次线性插值。
d.纹理处理2【续】:各向异性过滤(Anistropic Filtering)可进行扁平型范围查询,mipmap是正方形范围查询,因为各向异性过滤会生成128 X 64 … 64 X 16 …;其他更精密的范围查询 EWA Filtering。
(4)纹理的应用:texture = memory + range query (filtering)
a. 环境光照(只记录其方向信息,认为其光源无限远)。处理方法:1. Spherical Environment Map(球形环境映射),但是球形展开会产生上下扭曲;2.Cube Map(立方体映射)将环境光映射到立方体6个面展开;
b. 凹凸贴图(纹理不仅仅只记录颜色,也可以定义相对高度)。根据其相对高度改变其每个像素点 的法线方向,从而造成着色的明暗变化。处理方法:2D. 假设建设局部坐标系,其原法线方向为(0,1),经过增高dp,计算其切线方向,旋转90度得到法线方向处理方法(3D):
c. 位移贴图,真实改变三角形顶点位置
d. 3D纹理映射(噪声)
e. 将纹理预处理,实现一些效果(如阴影)
f. 3D纹理构造立体展示
(1)隐式表示(Implicit):表示模型点的一定关系,不给出具体点,如边界点满足f(x,y,z) = 0;隐式表示的优点:可以快速判断点是否在面上或面内外。a.数学函数表示;b.基础形状通过布尔运算(交,并)得到复杂几何;c.距离函数融合;d.水平集融合;e.分形(Fractals)
显示表示(Explicit):模型点直接给出,或通过参数函数映射;显示表示的优点:容易得到模型的形状。a.点云(Point Cloud)b.多面形网格(Polygon Mesh)
(1)贝塞尔曲线(Bezier Curves)使用一系列控制点定义一条曲线。三个控制点的贝塞尔曲线,b0->b1长度截取t倍得到b01,b1->b2长度截取t倍得到b11,b01->b11长度截取t倍得到贝塞尔曲线在t时刻点的位置。
同理,四个控制点的贝塞尔曲线,使用左三点做贝塞尔曲线在t时刻点位置b02,使用右三点做贝塞尔曲线在t时刻点位置b12, 再b02->b12长度截取t倍得到贝塞尔曲线在t时刻点的位置。
贝塞尔曲线公式:贝塞尔曲线性质:【后面两个性质】曲线仿射变换和其控制点仿射变换再做曲线是一样的;曲线均处于凸包(包含所有点的最小包围圈)内。
片段化贝塞尔曲线(Piecewise Bezier Curves):一般定义每四个点形成一段贝塞尔曲线。贝塞尔曲线连续:C0连续指两段相邻曲线的控制点前一段终点和后一段起点相同即可;C1连续指两段相邻曲线交接处导数方向相同,大小相同,即一阶导连续。
其他曲线:样条(splines)
(2)贝塞尔曲面:输入4X4控制点,对于x方向做贝塞尔曲线,其有一个t参数表示,对于y方向其贝塞尔曲线的点构成的控制点再做贝塞尔曲线,其还有一个参数t1表示。那么t,t1用(u,v)表示。
(1)网格细分(Mesh Subivision):增加三角形个数,在引入更多三角形后,进行位置变化使得更圆滑。
a. Loop Subivision:只能处理三角形网格。首先(细分),将三角形边的中心作为新顶点相连,从而划分每个三角形为四个三角形;其次(调整),加权公式调整新顶点和旧顶点:b. Catmull-Clark Subdivision: 可以处理非三角形网格,处理一般网格情况。首先,将面的边取中点,在面中取中心点,连接边中点和面中心点,可以将四边形继续细分为四边形,非四边形通过一次细分变为四边形面;其次,分别公式调整边中点和面中心点。
(2)网格简化(Mesh Simplification)减少三角形个数。
边坍缩(Collapsing An Edge)将一些边缩成一个点,那么如何选择坍缩边:二次误差度量(Quadric Error Metrics)测量每个边二次度量误差,取最小二次度量误差的边,在边进行坍缩后动态更改其他相连边的二次度量误差。
(3)网格正规化(Mesh Regularization)修改用正三角形表示图形
光栅化和光线追踪是两种不同的成像方式。
为什么需要光线追踪:1.光栅化难以处理的问题:soft shadows, glossy reflection, indirect illumination。2.光栅化处理速度快,质量低,用于实时效果;光线追踪生成速度慢,质量高,用于离线效果,如:电影。
如何构建每个像素点与眼睛构成的初始光路,课程没有细讲。额外讲解
(3)光线与显式表面的交点:计算光线与三角形求交–>(方法一)计算光线与三角形平面交点,再判断交点是否在三角形内。如何计算光线与平面交点:平面的方程式:f(p):(p-k)dot N = 0,其中k为给定的平面上的点,如三角形顶点;N为三角形平面的法线。代入平面方程与光线方程求出t。
(4)计算光线与三角形求交–>(方法二):代入三角形重心坐标和平面方程。
b. 如何判断光线与AABB求交:对于三组对齐平面(对面),光线全进入三组对面中才算进入盒子;光线不在任意一组对面则算离开盒子。具体操作,对于每组对面求出其进入时间和出去时间,然后对三组的进入时间求最大值,对三组出去时间求最小值。
c. 处理光线为射线而非直线:当进入离开的时间为负,则光线和盒子无交点,当进入时间为负&离开时间为正,则光源点在盒子内。
(2)如何使用AABB加速光线追踪
a. Uniform Grids:
Preprocess:找到一个包围盒;划分多个格子;与物体表面相交格子标记,表示此格子相交可能会有物体相交。
Ray-Scene Intersection:与光线相交格子是否被标记过,标记过表示这个格子的物体可能与光线相交。
b. Spatial Partitions(空间划分):
如何划分格子的算法之一KD-Tree:每层划分按x,y轴交替划分,找一个何时的位置划分,形成子节点,最终形成二叉树。
如何使用KD-Tree:先判断光线与根节点有无交点,如果有再判断其两个子节点有无交点,若有交点,继续往子节点判断,直到无交点或者判断到叶子节点,若得到叶子节点有交点,再计算叶子节点中的物体和光线求交。
KD-Tree两个问题:难以判断物体和格子求交;物体和格子交集有多个。
c. Bounding Volume Hirerarchy (物体划分 BVH)
找到一个包围盒;一个包围盒物体分成两堆重新求包围盒,其生成的两个包围盒在父包围盒内;逐层分堆至堆中三角形数量比较合适,形成二叉树。 解决了KD-Tree的两个问题,但生成包围盒会有交集。
如何分堆:选择长的边,取中间的物体,…其他方法
Radiant Intensity: 光源的能量定义:Flux per unit solid angle。
solid angle(立体角)= 弧度制在空间中的衍生 = (其面积是物体在单位体上的投影)面积A / 半径平方r²
differential solid angle(微分立体角:空间任意方向的立体角变化)= dA/r² = sinθdθdφ
Irradiance: 物体点接收光的能量定义: Flux per projected unit area。E(x) = dΦ(x)/d面积A(垂直光线的面积) [W/m²] .[lm/m²]
Radiance:光线传播中能量:Flux, per unit solid angle,per projected unit area.
(2)Bidrectional Reflectance Distribution Function(BRDF):why,用于一个表面如何把收集到的光线能量反射发送到各个立体角去。BRDF是一个比例,跟反射点材质相关。
(3)The Rendering Equation 渲染方程
某个点对某个方向发出的能量 = 自身发光对某个方向发出的能量+收集的能量反射某个方向的能量(= 每个方向角收集能量 * BRDF * cosθ垂直光分量)。
(4) 全局光照(多次反射渲染方程修正)
Materias and Appearances
什么是材质:Materias = BRDF
材质列表:
(1)Diffuse/Lambertian Material 漫反射材质
解释下图:Lo(wo)是指反射方向能量,fr是指BRDF比例系数,Li是指某个入射方向的能量,H2是指积分域。积分半球所有入射能量得到的是此点能够接收的总能量(即渲染方程),在不考虑能量吸收的情况下,等于反射方向能量;而在漫反射下,若所有方向入射能量相同,根据能量守恒定律,任意反射方向能量应等于任意入射方向能量;从而得到BRDF比例系数1/π,由于考虑非完全反射,albedo是指反射率。
(2)Glossy material 金属材质
(3)Ideal reflective/refractive material 理想反射/折射材质(既包含反射,又包含折射)
a. 反射方向计算:正向的反射w,与从上往下向的反射φ
b. 折射的计算:正向的折射w,与从上往下向的折射φ。注意的是在计算折射角时,由于可能会有没有折射现象(即全反射),应该直接计算折射角的余弦值,可以保证有折射光。
c. Fresnel Reflection / Term (菲涅尔项):解释能量反射和折射的比率。准确与近似:
(4)Microfacet Material 微表面材质
a. 微表面:对于粗糙的表面,可以看作多个微表面,每一个微表面作为微小的镜面。
(5)Isotropic/Anisotropic Materials 各项异性材质
BRDF属性
Non-negativity 非负
Linearity 线性
Reciprocity principle 可逆性
Energy conservation 能量守恒
Isotropic or anisotropic 各项同性或各项异性
BRDF测量
对于现实得到物体给定入射和出射,枚举计算每个方向的BRDF。