GAMES101

文章详细介绍了计算机图形学中的光栅化技术,包括三角形的采样和反走样,以及光线追踪的基本概念,如阴影映射、Whitted风格的光线追踪。此外,还深入探讨了线性代数在图形学中的应用,如向量和矩阵的运算,以及在2D和3D变换中的作用。同时,提到了动画和模拟的概念,包括关键帧、物理模拟和粒子系统。
摘要由CSDN通过智能技术生成

目录

一、简介

1.1 Rasterization(光栅化)

1.2 Curves and Meshes(曲线和曲面)

1.3 Ray Tracing(光线追踪)

1.4 Animation/Simulation(动画/仿真)

二、线性代数

2.1 点乘

2.1.1 运算法则

2.1.2 运算

2.1.3 作用

2.2 叉乘

2.2.1 集合意义

2.2.2 运算规则

 2.2.3 运算

2.2.4 作用 

三、Eigen库

3.1 向量与矩阵

3.1.1 向量

3.1.2 矩阵

3.2 转置、共轭和伴随

3.2.1 转置

3.2.2 共轭

3.2.3 伴随

3.3 平移、旋转和齐次变换矩阵

3.3.1 平移

3.3.2 旋转

3.3.3 齐次变换矩阵

四、2D Transformation

4.1 Scale(缩放)

4.2 Reflection(翻转)

 4.3 Shear(切变)

 ​编辑

4.4 Rotate(旋转)

4.5 Translation(平移)

4.6 齐次坐标

4.7 Rotate(3D)

五、View/Camera Transform (视图变换)

5.1 将3D模型转换为2D平面的步骤(MVP)

5.2 View Transformation

5.3 Projection transformation

5.3.1 正交投影(Orthographic projection)

5.3.2 透视投影(Perspective projection)

六、 Rasterization(光栅化)

6.1 Triangles

6.1.1 采样

6.2 反走样

6.2.1 采样理论

6.2.2 反走样方法

6.3 Z-Buffer

七、 Shading(着色)

7.1 光照

​编辑

7.2 Diffuse Reflecion(漫反射)

7.2.1 角度

7.2.2 能量

7.2.3 漫反射

7.3 Specular(高光)

7.4 Ambient(环境光)

7.5 Blinn-Phong模型

7.6 着色频率

7.7 法线

7.8 Pipeline

八、 Shading-Texture Mapping(纹理映射)

8.1 Texture Coordinates(纹理坐标)

8.2 Barycentric Coordinates(重心坐标)

8.2.1 应用

8.2.2 问题

8.3 纹理应用

8.3.1 环境光映射

8.3.2 凹凸贴图

8.3.3 位移贴图

九、 Geometry(几何)

9.1 隐式几何

9.1.1 Constructive Solid Geometry

9.1.2 距离函数

9.1.3 水平集

9.1.4 Fractals(分型)

9.2 显示几何

9.2.1 point cloud

9.2.2 Polygon Mesh(多边形面)

9.3 Curves(曲线)

9.3.1 贝塞尔曲线

9.3.2 de Casteljau Algorithm

9.4 Surfaces(曲面)

9.4.1 贝塞尔曲面

9.4.2 Mesh Subdivision(网格细分)

9.4.3 Mesh Simplification(网格简化) 

9.4.4 Mesh Regularization

十、 Ray tracing(光线追踪)

10.1 Shadow Mapping(阴影)

10.2 Whitted-Style Ray Tracing

10.2.1 光栅化的局限

10.2.2 光线

10.2.3 Whitted-Style

10.3 Basic radiometry(辐射度量学)

10.3.1 Radiant Energy(辐射能) and Flux(Power)(辐射通量)

10.3.2 Radiant Intensity(辐射强度)

10.3.3 Irradiance(辐照度)

10.3.4 Radiance

10.3.5 Bidirectional Reflectance Distribution Function(双向反射分布函数)

10.3.6 The Reflection Equation(反射方程)

10.3.7 The Rendering Equation(渲染方程)

10.4 Monte Carlo Path Tracing(蒙特卡洛路径追踪)

10.4.1 Monte Carlo Integration(蒙特卡洛积分)

10.4.2 Path Tracing

十一

11.1 材质和外观

11.1.1 material

11.2 Advanced Topics in Rendering

11.2.1 Advanced Light Transport

Bidirectional Path Tracing(双向路径追踪)

Metropolis Light Transport

Photon Mapping(光子映射)

Vertex Connection and Merging

Instant Radiosity(实时辐射度)

11.2.2 Advanced Appearance Modeling

11.2.2.1 Non-Surface models

11.2.2.2 Surface models

11.2.2.3 Procedural Appearance

十二、相机、棱镜和光场

十三、颜色和感知

十四、Animation(动画与模拟)

14.1 Keyframe(关键帧)

14.2 Physical 

14.3 Particle Systems(粒子系统)

14.4 Inverse Kinematics(逆运动学)

14.5 Rigging

14.6 Single particle simulation(单粒子模拟)

14.6.1 Euler's Method(欧拉方法)

14.7 Rigid body simulation(刚体模拟)

14.8 Fluid simulation(流体模拟)

一、简介

1.1 Rasterization(光栅化)

将三维空间的几何形体投影在屏幕上。

1.2 Curves and Meshes(曲线和曲面)

1.3 Ray Tracing(光线追踪)

1.4 Animation/Simulation(动画/仿真)

二、线性代数

2.1 点乘

2.1.1 运算法则

满足交换律

 

2.1.2 运算

 

2.1.3 作用

①找到两个向量间的夹角

②向量间的投影

找到一个向量的投影之后,可以对该向量进行水平和垂直方向上的分解。

③分析两个向量是否接近(对于单位向量,接近时点乘的结果趋向于1,最小为-1)

④分析向量的相对位置(点乘的结果大于0或小于0)

2.2 叉乘

2.2.1 集合意义

2.2.2 运算规则

不满足交换律

 

 2.2.3 运算

2.2.4 作用 

 ①判断向量间的左右关系(若a×b得到的c向量为正向量,说明ab的右侧)

 ②判断内外关系

如上图,分别计算AB×AP,BC×BP,CA×CP,得到的新向量均为正向量,说明点P在△ABC内

三、Eigen库

3.1 向量与矩阵

3.1.1 向量

初始化:Eigen::Vector2d a(5.1, 5.2); 默认为列向量

索引:使用小括号,如a(0),a(1)

运算:

Eigen::Vector3d v(1,2,3);
Eigen::Vector3d w(4,5,6);
v.dot(w)//点积运算
v.cross(w)//叉积运算,只适用于大小为3的向量

3.1.2 矩阵

// 初始化:Eigen::MatrixXd,d代表double类型,f代表float类型,X代表矩阵维度
// 方阵初始化
Eigen::Matrix2d mat1;
mat1 << 1, 2, 
        3, 4;
// 一般矩阵初始化,需要指定维度
Eigen::MatrixXd mat2(3, 2); // 三行二列
mat2 << 1, 2, 3, 
        4, 5, 6;

// 索引:使用小括号
mat1(1, 1) = 4;
#include <iostream>
#include <Eigen/Dense>
 
using namespace std;
int main()
{
  Eigen::Matrix2d mat;
  mat << 1, 2,
         3, 4;
  cout << "Here is mat.sum():       " << mat.sum()       << endl;
  cout << "Here is mat.prod():      " << mat.prod()      << endl;
  cout << "Here is mat.mean():      " << mat.mean()      << endl;
  cout << "Here is mat.minCoeff():  " << mat.minCoeff()  << endl;
  cout << "Here is mat.maxCoeff():  " << mat.maxCoeff()  << endl;
  cout << "Here is mat.trace():     " << mat.trace()     << endl;
}

// 获取最值所在的位置
std::ptrdiff_t i,j;
float minOfM = m.minCoeff(&i, &j);

3.2 转置、共轭和伴随

3.2.1 转置

a.transpose()

对于就地转置,使用a.transposeInPlace(),而不能使用a=a.transpose()

3.2.2 共轭

a.conjugate()

对于实矩阵相当于无操作

3.2.3 伴随

a.adjoint()

3.3 平移、旋转和齐次变换矩阵

3.3.1 平移

3.3.2 旋转

3.3.3 齐次变换矩阵

四、2D Transformation

4.1 Scale(缩放)

4.2 Reflection(翻转)

以y轴为对称轴进行翻转

 4.3 Shear(切变)

 

在进行Shear之后,图像中的每个点的纵坐标保持不变,即y' = y

而对于横坐标,当y=0时,x'=x;当y=1时,x'=x+a 

所以对于任意的点(x,y),有x'=x+ay,y'=y

4.4 Rotate(旋转)

观察右下方的点(1,0),经过变换后,其坐标为(cosθ,sinθ)

观察左上方的点(0,1),经过变换后,其坐标为(-sinθ,cosθ)

 

该矩阵为正交矩阵。

4.5 Translation(平移)

4.6 齐次坐标

 引入齐次坐标后的平移变换:

4.7 Rotate(3D)

绕x轴旋转时,x坐标保持不变,在yOz平面上进行旋转操作;绕z轴时同理

 

 因为z×x得到y,绕y轴旋转时,y坐标保持不变,在zOx平面上进行旋转

五、View/Camera Transform (视图变换)

探秘三维透视投影 - 齐次坐标的妙用_哔哩哔哩_bilibili

5.1 将3D模型转换为2D平面的步骤(MVP)

①准备需要进行变换的模型(model)

②找到视图变换的角度(view)

③进行投影(projection)

5.2 View Transformation

进行视图变换,需要确定:①观测位置 ②观测方向 ③向上方向

 如果相机和物体的相对位置保持不变,那么得到的变换结果也不变,为了方便起见,可以将相机放在固定的位置(源点),向上方向为y轴正方向,观测方向为z轴负方向。

 经过以上的定义,需要修改原来的相机位置、观测方向以及向上方向。

 以上变换可以通过变换矩阵表示,即先修改相机方向(平移变换),再修改观测方向以及向上方向(旋转变换),其中平移变换可以简单表示为:

 在进行旋转变换时,可以先考虑逆变换,即X->(g×t),Y->t,Z->-g,以上变换可以表示为:

,该矩阵的转置矩阵就是所求的旋转变换(该矩阵是正交矩阵)

5.3 Projection transformation

投影变换可以分为正交投影和透视投影,透视投影具有近大远小的特点。

5.3.1 正交投影(Orthographic projection)

正交投影的简单理解舍弃z

①固定观测位置(原点)并向-z方向观测

②舍弃z坐标(3维坐标系->2维坐标系)

③将观测结果压缩到[-1,1]×[-1,1]

实际上,进行正交变换时需要进行平移变换以及缩放变换

①将物体平移中心平移到原点处(其他点也随之变换)

②对物体进行缩放变换

5.3.2 透视投影(Perspective projection)

为进行透视投影,定义:

①近平面上的点保持不变

②远平面上点的z值保持不变

③远平面的中心点在进行变换后仍是中心点

步骤:

①将物体Frustum变为Cuboid

x坐标和y坐标的变化

 

接下来需要得到z进行变换后的值

 

也就是对向量1进行变换后可以得到向量3,向量1为原始坐标,向量2和向量3代表变换后的坐标,即:

根据以上信息,已经可以确定变换矩阵的部分值

又根据信息

可以确定变换矩阵的第三行为(0,0,A,B),且

 得到

 到此为止,变换矩阵已经完整求出,该矩阵为:

②对Cuboid进行正交投影

通过以上两个步骤,可以得到最终的结果:

六、 Rasterization(光栅化)

光栅化(把东西画在屏幕上)

简单理解,平面由许多像素组成,像素是具有颜色的小块(rgb)

规定,像素用坐标来表示(x,y),其中x和y都是整数,且

像素的中心位于(x+0.5,y+0.5)

为了将物体显示在屏幕上,需要进行变换:

用矩阵表示为:(先缩放再平移)

6.1 Triangles

三角形的性质:

①最基本的多边形,其他多边形都能分割成多个三角形

②三角形内部在平面上

③容易判断内外(叉积)

④容易进行插值操作

6.1.1 采样

把一个连续的函数离散化

①inside函数

给定一个点(x,y),判断该点是否在三角形内

 通过该函数可以得到:(红色点代表该像素在三角形内

②采样操作

遍历屏幕上所有像素,判断该像素的中心是否在三角形内

在实际操作中没必要遍历所有像素,可以定义bounding box,即围住三角形的最小的四边形

对这个四边形进行遍历。

经过填色后,得到的结果具有明显的锯齿现象。

6.2 反走样

6.2.1 采样理论

几种不同的走样:(锯齿、摩尔纹、车轮效应...)

 造成走样的原因:

 信号变换的速度太快,但是采用的速度太慢.

 如下图,对于蓝色曲线和黑色曲线,使用相同的频率对两个不同的函数进行采样,可以得到相同   的采样结果,这时就会造成走样现象。

 对于相同的采样速度,函数的频率越高,采样的效果越差。

傅里叶变换和逆傅里叶变换

傅里叶变换可以把一个函数从时域变换到频域

在频域图像上,中心位置为低频区域,四周为高频区域,某个区域越亮,说明该区域的信息越多。

上图说明,图像的信息多在低频区域。

滤波(删除特定频率上的信息)

高通滤波(删掉低频信息,保留高频信息)

通过高通滤波,保留了原始图像的边界信息(边界处经常发生细节的突变)

低通滤波

 通过低通滤波原始图像变得模糊(边界模糊),保留了图像的细节。

卷积定理

时域上的卷积=频域上的乘积,反之亦然

在时域上做卷积操作=①进行傅里叶变换变为频域,②对卷积核进行傅里叶变换,③对原始图像和卷积核所对应的频域进行相乘操作,④将上面操作得到的频域结果通过逆傅里叶变换得到处理后的图像。

 

采样

采样=重复原始信号的频谱

在时域上a×c=e,对应的在频域上,b和d进行卷积,得到f

若采样的速度慢,会造成信号的重叠,这时就会造成走样。

 

6.2.2 反走样方法

①增加采样率(需要更高的分辨率)

②先模糊再采样

求均值(模糊)

对于一个像素,求该像素内颜色的平均值

MSAA(模糊)

继续划分像素,得到更多“小像素”

 

6.3 Z-Buffer

为了直观地看出远近的信息,定义frame buffer存储颜色值,depth buffer存储深度值,其中深度值为每个像素当前的最小z-value。

假设z的值为正数(z值越小,代表距离相机越近)

七、 Shading(着色)

把不同的材质应用在物体上的过程。

7.1 光照

对于任何一个点,光照由三部分组成,分别是高光、漫反射和环境光。

在下图中,v代表观测方向、l代表光线方向、n为某一点处的法线方向(单位向量

7.2 Diffuse Reflecion(漫反射)

入射光线被均匀地反射到各个方向,这种现象称为漫反射

7.2.1 角度

相同的光线照射到不同角度的平面时,平面接收到的光照不同。对于任意一点,该点接收的能量由该点处的法线方向和光线入射方向的夹角决定,其中cosθ = l · n。

7.2.2 能量

根据能量守恒,内圈和外圈的总能量相同,距离光源越远,某个点接收到的能量越少。

7.2.3 漫反射

max(0, n · l)保证该值非负,即最小值为0。

其中kd为漫反射系数,kd的值越大,代表该点吸收的能量越少,反射的能量越多(亮度更高)。

7.3 Specular(高光)

下图中,R为反射方向,当R的方向与v的方向接近时,可以在该点观察到高光。

由于求出任一点光线的反射方向比较麻烦,可以通过求出v和l的半程向量h,利用h判断v和R是否接近。即求出h与n的夹角,夹角越小,max(0, cosα)的值越大。

指数p的值越大,pow(max(0, cosα),p)的值越小,高光越小。

7.4 Ambient(环境光)

假设任一点接收到的来自环境的光的强度都是相同的,可以近似得到环境光(常数)。

7.5 Blinn-Phong模型

7.6 着色频率

对于相同的模型,在该模型上使用不同的频率进行着色,得到的结果也不同。

 上图中,图1以面为单位进行着色。

图2对每个面的所有顶点为单位进行着色,并对面内进行插值。

图3对每个像素进行着色,首先得到像素的顶点处的法线的方向,再在像素内部进行法线方向的插值,从而得到每个像素的法线方向。

当图形的顶点数量足够多(着色频率高),此时采用简单的着色方法仍然可以得到光滑的结果。

7.7 法线

对于任一顶点,考虑该顶点邻近的所有面的法线,对这些法线求平均,就可以得到该点处的法线。

对于任一像素,已知顶点处的法线,可以根据重心坐标求出其他点处的法线。

7.8 Pipeline

空间中的顶点->投影到二维平面->定义每三个点组成一个三角形->对每个三角形进行光栅化和深度缓存->着色->得到屏幕中显示的图形

八、 Shading-Texture Mapping(纹理映射)

Texture Mapping定义任一点的基本属性。

将纹理图片“贴”到物体上。物体上任意一个三角形的顶点都能在纹理上找到其相应位置。

8.1 Texture Coordinates(纹理坐标)

每个顶点对应一个纹理坐标(u,v),u和v在(0,1)之内。

8.2 Barycentric Coordinates(重心坐标)

引入重心坐标是为了在三角形内部进行任意属性的插值(颜色、法线和纹理坐标等)。

△ABC所在平面的任意一点(x,y,z)都可以用三角形三个顶点的线性组合表示,线性组合的三个系数α、β和γ作为一个新的坐标,即(α,β,γ),这个坐标就是点(x,y)的重心坐标

注:

若α、β和γ相加为1,说明点(x,y)在△ABC所在的平面内;

若α、β和γ都为非负数,说明点(x,y)在△ABC内。

任一点的重心坐标可以通过面积求得。

其中△ABC的重心坐标为(1/3,1/3,1/3):

对于任一点,求出其重心坐标,若已知顶点的属性,就可以求出该点处的属性。

投影之后,一点的重心坐标会发生变化。如果在三维空间中进行插值,需要找到点(a,b,c)的重心坐标,利用该重心坐标在三维空间中进行插值,而不能直接在投影之后的三角形内插值。

8.2.1 应用

纹理可以作为漫反射系数。

如果已知各个三角形顶点对应的纹理坐标,可以利用重心坐标进行插值,得到三角形内部各个点对应的重心坐标,接下来在纹理图片中查询该坐标对应的颜色(即漫反射系数)。

8.2.2 问题

但是,如果纹理太小,而物体太大,会导致物体上的点对应的纹理坐标取到一些非整数值,此时需要对这些非整数值做一些特殊的处理。

导致多个像素会映射到同一个texel。

为了得到更好的映射效果,可以进行双线性插值。

对于一个非整数点,可以找到该点临近的4个中心点:

可以先对水平方向做两次插值,得到u0和u1,在对u0和u1方向进行竖直方向的插值,得到最终结果。

而当纹理太大时,会引起走样。

在近处,一个像素覆盖在纹理上的区域较小,而远处,一个像素会覆盖纹理上很大的区域。

(平均)范围查询

点查询,如上述的双线性插值,给定一个点,求出它对应的值。

范围查询,给定一块区域,得到其内部的平均值、最小值或最大值。

Mipmap

可以进行范围查询,但只局限于近似正方形区域的范围查询。

对于一个纹理图片,首先对其进行分层,上一层的像素是下一层的1/4,直到某一层的像素为1×1.

对于一个方形像素,假设其映射到纹理坐标中仍然是一个正方形(近似),且正方形的边长为L(创造mipmap的条件)

得到正方形的边长后(若L=4,则说明在纹理坐标系中,该像素对应了4×4的一块区域,那么第0层为4×4,第1层为2×2,第2层为1×1,这一个像素的值就是该区域的平均值

为了使结果更加连续,可以进行插值。

Anisotropic Filtering(各项异性过滤)

效果更好。存储了更多额外信息。

8.3 纹理应用

texture = memory + range query (一块内存,并对这块内存进行范围查询)

纹理是一块数据。

8.3.1 环境光映射

把环境光记录在球面上,把球面展开可以得到一幅图片。

但是,展开后会有一些问题,如下图,上面和下面会出现扭曲的现象。

为了减少扭曲,可以进一步将球面上的纹理映射到立方体上。

8.3.2 凹凸贴图

纹理还可以表示一个点处的相对高度,从而表示出凹凸性。但实际上,这种方法并没有改变原有物体的凹凸性,只是看起来具有凹凸性。

在下图中,黑线代表原来的物体表面,黄线代表改变相对高度后的物体。此时,某一点处的法线也发生了相应的变化。

8.3.3 位移贴图

九、 Geometry(几何)

表现几何有两种方式,分别是隐式几何(implicit)显式几何(explicit)。

implicitexplicit

不知道几何上的点具体在哪,只知道这些点满足的关系

所有的点都直接给出或者通过参数映射定义图形的表面

难以直接看出隐式几何表示的图形;容易判断某个点是否在该图形上

9.1 隐式几何

直接用算术的方法难以表示复杂的图形。

Shader中使用距离函数(Distance Function)绘制二维图形 - 知乎

9.1.1 Constructive Solid Geometry

对于基本的几何图形,可以通过布尔运算得到复杂的图形。

9.1.2 距离函数

定义任何一个点到边界的最短距离,靠近边界的点的距离较小。

9.1.3 水平集

每个格子有一个确定的值,对于f(x)=0就是找到所有等于0的点,将这些点连成一条曲线。

9.1.4 Fractals(分型)

9.2 显示几何

9.2.1 point cloud

用一系列点表示图形,点的密度越大,表示的效果越好。

9.2.2 Polygon Mesh(多边形面)

使用一系列多边形表示图形。

The Wavefront Object File Format(一种文本文件)定义了空间中的顶点、法线、纹理以及它们的连接关系。这样就表示了一个几何图形。

9.3 Curves(曲线)

9.3.1 贝塞尔曲线

用一系列的控制点定义一条曲线。

9.3.2 de Casteljau Algorithm

在0-1之间取值t,如下图,对于两段线段b₀b₁和b₁b₂,起点分别为b₀和b₁,在两段线段上,分别取两个点b₀¹和b₁¹,使得b₀b₀¹=tb₀b₁,b₁b₁¹=tb₁b₂

接着连接 b₀¹和b₁¹,在这条线段上取点b₀²,使得b₀¹b₀²=tb₀¹b₁¹

这时点b₀²就是t所对应的点

对于任意的t,找到其对应的点,将这些点连接起来,就得到了贝塞尔曲线。

下图中,任意t对应的点都是由所有控制点和时间t得到的,且满足下面的关系。

一般的,对于n个控制点,在时间t上对应的点为:

,其中

但是当控制点过多时,得到的贝塞尔曲线不直观,会变得非常平滑。

为了解决这种现象,可以用每四个控制点定义一段贝塞尔曲线,将得到的所有贝塞尔曲线连接起来就得到了完整的贝塞尔曲线。

为了保证连接后的贝塞尔曲线保持光滑,在连接点处要保证连接点处的切线方向保持一致,且切线的大小也一样(C¹连续)。

9.4 Surfaces(曲面)

9.4.1 贝塞尔曲面

上图的曲面由16个控制点得到,使用参数(u,v),对所有的u∈[0,1],首先得到四条贝塞尔曲线,在某一时间u,对应四条贝塞尔曲线上的四个点,这四个点作为控制点,对于所有的v∈[0,1],就得到另一条不同方向上的贝塞尔曲线。对于所有的时间u和v,得到对应的空间上的点,这些点组成的曲面就是贝塞尔曲面。

9.4.2 Mesh Subdivision(网格细分)

Loop Subdivision(三角形网格)

①将一个三角形划分为四个三角形

②改变三角形顶点的位置

对于新的顶点(各边的中点

对于旧的顶点(细分前三角形的顶点)

其中n为顶点的度,u为其他值。这个顶点的值由它自身以及邻近的其他旧的顶点决定。

Catmull-Clark Subdivision(General Mesh)

使用这种方法,首先需要明确:

①所有的网格分为四边形面和非四边形面

②定义度不为4的点为奇异点

该方法对网格进行细分时,进行以下操作:

①找到每条边的中点

②找到每个网格的中心点

③连接这些新的点

经过一次细分之后,发现当前有4个奇异点,其中有两个是原来的奇异点,且已经没有非四边形面。

总结:若细分之前有n个非四边形面,那么经过一次细分之后,会引入n个新的奇异点,且所有的面都变成了四边形面。

对网格进行细分之后需要调整点的位置。

对于新得到的点(中心点以及边的中点):

对于原来的顶点:

9.4.3 Mesh Simplification(网格简化) 

如下图,在进行简化时尽量保持物体的基本轮廓。

二次误差度量

(看简介)网格简化演示_哔哩哔哩bilibili_演示

网格简化 二 、QEM算法_微小的鱼的博客-CSDN博客

灰色图形为原始图形,为了简化图形,我们需要进行边坍缩,在平面中找到一点,使得上面的四条边坍缩为两条边,并且保持原图的大致轮廓。

核心思想是通过每次迭代从网格中选定一对顶点将其合并成一个新的顶点,合并哪两个点是基于一个误差计算算法,经过这样不断的迭代下去就可以得到希望节点数目要求的网格,也就是我们的简化模型。

为了找到这个点,我们可以使用二次误差度量,即这个点与其他面的距离的平方和最小。

在进行边坍缩时,对于每一条边,先假设对这条边进行坍缩,并找到最优点对应的二次度量误差。对所有的边进行边坍缩并比较所有的误差,对这些值进行排序,找到这些值中的最小值,先对这个值对应的边进行坍缩。坍缩完这条边之后,需要更新其他边对应的误差值(优先队列)。

9.4.4 Mesh Regularization

十、 Ray tracing(光线追踪)

10.1 Shadow Mapping(阴影)

阴影之外的点必须同时被光源和相机看到。

①从光源处看场景,记录光源在不同方向可以看到的深度(蓝色)。

②从摄像机处看场景,对于可以看到的场景,记录这个方向(点与光源的连线)上的深度(橙色)并查找这个方向上之前记录的深度。

如果两个深度一致,说明该点在阴影之外。

10.2 Whitted-Style Ray Tracing

10.2.1 光栅化的局限

光栅化的速度较快,但质量相对较低。

而光线追踪的结果更加准确,但是非常慢,多用于离线。

10.2.2 光线

光线传播

①光线沿直线传播

②光线不会发生碰撞

③光线由光源发射,并到达人眼

光线投射

对于成像屏幕上的每一个像素,将该像素与眼睛连线,延长该射线,直到这条射线与某个物体相交。将相交点与光源连线,如果该点不在阴影中,那么形成了一条有效的光路,即眼睛-物体-光源。接下来就可以对该像素进行着色。

10.2.3 Whitted-Style

在下图中,假设球体为玻璃球,当光线照射到球体上时,还会发生反射和折射,此时反射光和折射光还会继续传播,直到碰到其他物体。在这个过程中,光线与多个物体产生交点,这些交点如果可以被光源看到,那么在着色时,这个像素的颜色与这些交点都有关。

光线

交点1(慢)

光线与球面的交点

交点同时是光线和球面上的点,联立光线与球面的表达式,得到:

其中,o(光源),d(光线方向),c(球心),R(半径)都是已知的,t是未知的。上述方程是关于t的一元二次方程。(若t有两个值,取最小值)

一般的,对于光线与隐式表面的交点,同样有:

对于显式表面,物体表面由许多三角形网格组成,所以问题转化为光线是否与三角形有交点。

由于求解光线与三角形的交点比较麻烦,我们可以先判断光线是否与三角形所在的平面有交点,如果有交点,再判断该点是否在三角形内。

所以问题再次转化为先求光线与三角形所在平面的交点再判断交点的位置

我们把平面定义为:该平面有确定的法线且平面上有一个确定的点。

那么,该平面上任一点都满足: 

类似的,可以求解出交点处t的值:

接下来就可以判断该交点是否在三角形内。

使用Moller Trumbore Algorithm可以快速的判断该交点是否在△内。

联系重心坐标的知识,我们可以将三角形所在的平面定义为等号右边的式子:

即等式左边为光线,等式右边为三角形所在的平面。

上式共有三个未知数,分别是t,b1和b2,如果求解出的b1、b2以及1-b1-b2都是正数,那么说明该交点在三角形内。

交点2(快)——包围盒

使用一个简单的图形将物体完整包围,如果光线与包围盒没有交点,那么一定不会与物体产生交点。

在三维空间中,我们把包围盒定义为三对平行的平面(并且这些平面与坐标轴平行)组成的交集区域。

以二维包围盒为例,该包围盒有两对平行边:

左图是光线与【垂直于x轴的两条直线】的两个交点;

中图是光线与【垂直于y轴的两条直线】的两个交点;

右图是光线与包围盒的两个交点,tmin和tmax连成的线段是左图和中图中两条线段的交集。

这两个交点代表光线进入和射出包围盒的时间。

对于三维的包围盒:

光线只有进入三对平面时才代表光线进入了盒子;

只要光线离开任意一对平面就说明光线离开盒子。

根据以上逻辑,有:

下面是一些特殊情况:

总结:

Uniform Spatial Partitions(Grids)

在下图的包围盒中,创建许多网格,将物体存储在网格中。

当光线进入包围盒后,对于光线经过的每一个网格,判断这个网格内是否保存了物体,如果没有保存,则不执行任何操作,否则判断光线是否与物体相交,如果不相交则不执行任何操作,否则计算光线与物体的交点。

在生产网格时,如果网格的数目太多或太少都不能有效提速。

除此之外,在不同的场景,这种方法的效果也不同。如果场景内物体分布均匀,这种方法的效果较好。

为了改善这种方法,提出了Spatial Partition

使用这种方法,包围盒被不均匀地切分成很多网格。

对于一棵KD-Tree,首先判断光线与根结点表示的盒子是否有交点。

如果有交点,判断光线是否与它的子结点有交点(没有交点则跳过该区域),若有交点且该结点为叶子结点,找到光线与该区域内的物体的交点(最近的交点为目标交点);如果该结点不是叶子结点,则对于以该结点为根结点的子树,重复进行以上操作。

但是KD-Tree同样存在问题,如一个物体可能存在于多个网格中,且KD-Tree的建立麻烦。

Object Partitions & Bounding Volume Hierarchy

划分场景中的物体,划分之后,对划分后的物体重新计算其包围盒,这样保证了一个物体只能出现在一个包围盒中。但不同的包围盒可能存在交集。

BVH的建立步骤:

划分策略:

结点存储:

寻找交点:

10.3 Basic radiometry(辐射度量学)

  • 描述光照
  • 精确地描述光在空间中的属性
  • 在物理上准确地定义光照

计算机图形学(三)——辐射度量学 - 知乎

路径追踪(Path Tracing)与渲染方程(Render Equation) - 知乎

10.3.1 Radiant Energy(辐射能) and Flux(Power)(辐射通量)

10.3.2 Radiant Intensity(辐射强度)

每个单位立体角上的能量。

微分立体角:

对于整个球体,对其立体角积分,得到的值为4π。

在三维空间中,用Ω作为方向向量

对于一个均匀的点光源,它辐射在不同的方向上,每个方向上得到的intensity为:

对于下图中的灯泡,它的flux为815lumens,任意方向上的intensity为65candelas。

10.3.3 Irradiance(辐照度)

单位面积入射到表面一点上的功率(表面与光线方向垂直,否则需要投影)。

10.3.4 Radiance

描述光线在传播中如何去度量它的能量。

单位面积上,在某个方向上(单位立体角)辐射的能量。

irradiance是dA上的总能量;

radiance是dA在方向dΩ上的能量。

10.3.5 Bidirectional Reflectance Distribution Function(双向反射分布函数)

BRDF描述了某个方向上进来的光在出射方向上光的反射。

dA接收到的Ω方向上的irradiance为dE(Ω)

dL(Ω)为任何出射方向上的radiance的微分

10.3.6 The Reflection Equation(反射方程)

对于任何一个着色点,考虑所有方向上光的输入,求出出射方向上的能量。

对于反射光源,把反射物当做面光源。

10.3.7 The Rendering Equation(渲染方程)

对于下面的简式,l(u)为u辐射出去的能量,它等于自身的能量e(u)加上其他物体v的表面经过BRDF反射到u的能量。

10.4 Monte Carlo Path Tracing(蒙特卡洛路径追踪)

10.4.1 Monte Carlo Integration(蒙特卡洛积分)

均匀采样时,对于每次采样,在[a,b]上随机取x,计算以ab为长,f(x)为高的长方形的面积;

经过多次采样后,计算这些次采样的平均值。

在一般情况下:

 

10.4.2 Path Tracing

只考虑直接光照:

全局光照:

使用这种递归的方法计算具有一些问题:

①计算量太大

假设只在一个方向上进行采样:

但是此时得到的结果并不准确。对于一个像素,我们可以找到多条穿过该像素的光线,对于每条光线,计算对应的radiance,最终的radiance为这些值的平均值。

②没有设置递归出口

Russian Roulette(俄罗斯轮盘赌)

③采样方法不合适

使用均匀采样时,如果光源太小,可能只有少量光线可以打到光源,造成计算上的浪费。

改进:在光源上采样

改进的蒙特卡洛积分为:

十一

11.1 材质和外观

11.1.1 material

在渲染方程中,BRDF决定了物体的材质。

diffuse:

glossy:

water/glass:

反射

折射

Snell's law

如果入射介质的折射率大于折射介质的折射率就不会产生折射。

Fresnel Term(菲涅尔项)

入射方向与法线方向的夹角越大,反射的能量越多,否则折射的能量越多。

近似值

Microfacet(微表面)

从远处看,看到的是材质和外观;从近处看,看到的是几何(凹凸...)

 

根据微表面模型中的每个表面的法线分布,可以得到微表面模型的粗糙程度:

当微表面的入射方向和出射方向的半程向量与微表面的法线重合时(mirror),这个微表面才能把入射方向的光反射到出射方向上。

Isotropic/Anisotropic Materials(各向同性/各向异性材质)

BRDF的性质

①非负性

②线性

③可逆性

④能量守恒

⑤各向同性

BRDF的测量

枚举

11.2 Advanced Topics in Rendering

11.2.1 Advanced Light Transport

无偏的蒙特卡洛估计值:对于无偏的估计值,它的期望总是正确的值,无论我们使用多少样本。

否则是有偏的估计值,其中一种特殊情况,当样本足够多时,期望值的极限等于正确的值,我们称之为一致的。

Bidirectional Path Tracing(双向路径追踪)

当光源处的光线传播复杂时,使用双向路径追踪更好,但是不易实现,并且很慢。

Metropolis Light Transport

适用于复杂的光路传播,并且是无偏的。

缺点:

①难以估计收敛速度。

②对于每个像素不能保证同等的收敛速度。

③得到的结果比较脏。

Photon Mapping(光子映射)

光源散发的光子不停地弹射,直到遇到diffuse的材质。

从摄像机处的sub-paths也是不停的反射或折射,直到遇到diffuse物体。

得到结果:

光子分布越集中越亮。

Vertex Connection and Merging

Instant Radiosity(实时辐射度)

把真正的光源发出的光线碰到的物体表面点也当做光源(VPL)。

不适用的情况:

①VPL与着色点太近

②glossy物体

11.2.2 Advanced Appearance Modeling

11.2.2.1 Non-Surface models

Participating Media(参与介质)

Hair Appearance

Kajiya-Kay Model:光线照射到头发上后,会产生一个漏斗形的散射区域,同时会往该点的周围散射。

Marschner Model:光线遇到头发时,不仅会产生反射,还会产生折射,并且光线还会在头发内部出来。

Fur Appearance

Double Cylinder Model 

Granular Material(颗粒材质)

11.2.2.2 Surface models

Translucent Material(透光)

次表面反射

Dipole Approximation(近似)

Cloth(布料)

 

11.2.2.3 Procedural Appearance

十二、相机、棱镜和光场

传感器记录了irradiance。

Field of View(视场)

由此可知,视场与传感器大小和焦距有关。但是,人们普遍固定传感器大小,通过改变焦距从而改变视场。焦距越大,可视角度越小,看得越远。

传感器变小,焦距变小,可以达到同样的效果。

Exposure(曝光)

影响曝光的因素:

①光圈大小 ②快门速度 ③感光度

光圈越大(FN or F/N越大,f-number可以简单理解为圆的直径的倒数),曝光度越高。

快门时间越长,进入的光越多,但会产生副作用(运动模糊)。

任何一个信号都有噪声,提升感光度虽然可以提升曝光度,但同时会放大噪声。

Thin Lens Approximation(薄棱镜近似)

对于理想的棱镜(不考虑其厚度),当平行光透过棱镜时可以集中到一点(焦点)。

①经过中心点的光线不改变方向

②经过焦点的光穿过棱镜会变成平行光

③平行光穿过棱镜会经过焦点

f为焦距;

z0为物距,即物体到棱镜的垂直距离;

zi为像距,即成像到棱镜的垂直距离。

Circle of Confusion Size

Depth of Field(景深)

光圈的大小会影响模糊的范围。

光场

全光函数

光场记录了任何一个位置(2维)往任何方向(2维,极坐标)上的光的强度。

在两个平面上各自取一个点(s,t)和(u,v),这两个点所有情况的连线描述了任何一个位置在任何方向上的光的强度。

光场照相机可以实现每一个像素记录了来自不同方向上的光(而普通相机的像素之间记录了来自所有方向上的光)。

每次取不同方向上的光可以做到移动摄像机的效果。

十三、颜色和感知

SPD(谱功率密度):光线在不同波长的强度。

SPD的线性性质:

颜色是人的感知的结果,而不是光的属性。

十四、Animation(动画与模拟)

14.1 Keyframe(关键帧)

关键帧之间的帧可以通过插值的方法得出。

14.2 Physical 

Mass Spring System(质点弹簧系统)

质点弹簧系统是一系列连接的质点和弹簧。一个基本的单元包括弹簧和其两端的质点。

理想中的弹簧模型如下:

中间红色的式子表示a和b沿着ab方向的相对速度。

14.3 Particle Systems(粒子系统)

14.4 Inverse Kinematics(逆运动学)

对于一点p,求解出两个关节的角度θ1和θ2。

θ1和θ2的解可能并不是唯一的,如下图:

14.5 Rigging

14.6 Single particle simulation(单粒子模拟)

为了模拟单粒子运动,我们定义一个速度场,对于任何一个粒子,我们定义它在任何位置x,任何时间t处的速度为v(x,t)。

 计算粒子在不同时间的位置需要解关于时间t的常微分方程。

14.6.1 Euler's Method(欧拉方法)

Forward Euler:

缺点:不准确(误差、步长越大越不准确)、稳定性差(影响较大,与真实情况出现很大的偏差)

缓解不稳定性的方法:

Midpoint Method(中点法)

①使用欧拉方法得到终点a的位置

②取起点和终点的中点b

③以中点b的速度使用欧拉方法得到终点c的位置

Adaptive Step Size(自适应步长)

①使用欧拉方法得到终点位置x(t)

②取起点和xt的中点,在中点处使用欧拉方法得到△t/2后的终点位置x(t/2)

③如果两次终点的差距较大,则划分步长

Implicit Euler Method(隐式欧拉方法)

使用下一个时刻的速度或加速度计算下一时刻的位置(但下一时刻的速度和加速度是未知的,需要提前解出这两个值)。

Runge-Kutta Families

一系列适用于解ODE的方法。

Position-Based

14.7 Rigid body simulation(刚体模拟)

刚体不会发生形变,整个刚体可以类似的看作一个粒子。

14.8 Fluid simulation(流体模拟)

假定:①水由许多刚体小球组成;②水不可以被压缩

那么:在任何一个时刻,可以通过分析小球的分布密度(根据假设②,密度始终保持不变),修正各个小球的位置(使用梯度下降法)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值