图形学入门学习-GAMES101课程(2)

图形学中几个常用的例子:犹他茶壶斯坦福兔子、斯坦福龙、康奈尔box。

第十次课

纹理的应用:

In modern GPUs, texture = memory + range query (filtering)
• Environment lighting (用四个面记录、用一个球记录、用一个立方体记录)
• Store microgeometry 微分几何
• Procedural textures 过程纹理
• Solid modeling 实物造型
• Volume rendering 体渲染
纹理可以记录任何属性,可以不是颜色,比如高度、法向量等。
复杂表面需要更多的Triangle,也可以使用纹理解决(模型不够贴图凑)。
Bump / normal mapping 凹凸/法线贴图,伪造几何表面。
在这里插入图片描述
Displacement mapping 位移贴图,移动了vertex的位置,真实地改变了面的凹凸性。

介绍了很多隐式几何的例子

两种表达:implicit geometry和explicit geometry。
隐式几何:algebraic surface(方程式); level sets(水平集); distance functions(距离函数);Constructive Solid Geometry(构造实体几何)。
显式几何:point cloud; polygon mesh; subdivision。
各种方法有不同的优点,适应性不同。

第十一次课

几何的显式表示例子:explicit representations:
curve:Bezier curves; De Casteljau’s algorithm; B-splines.
surfaces: Bizier surfaces; Triangles & quads (subdivision, simplification, regularization).

point cloud

列举物体表面的点,是最简单的表示方式,可以表示任意物体;适用于大数据集;经常转换为多边形网格;在下采样的地方很难画出来。

polygon mesh

需要存储点和多边形,需要复杂的数据结构;易于对网格进行细分、简化和规范化。
不同的存储方式对应了不同的文件,例如.obj, .off, .mesh, .stl等。

curve

在这里插入图片描述

贝塞尔曲线:包含n个控制点,例如上图就是一个三次方贝塞尔曲线,p0和p3分别为起点和终点,定义一个参数 t ∈ [ 0 , 1 ] t\in[0,1] t[0,1],在向量 p 0 p 1 , p 1 p 2 , p 2 p 3 p_0p_1, p_1p_2, p_2p_3 p0p1,p1p2,p2p3上分别取t处的点,连接后得到两条线段,继续取t出的点,连接之后就得到了参数t对应的点。可以理解为使用线性插值的方法去电,递归操作。
三次方贝塞尔曲线的表达式: B ( t ) = ( 1 − t ) 3 P 0 + 3 ( 1 − t ) 2 t P 1 + 3 ( 1 − t ) t 2 P 2 + t 3 P 3 , t ∈ [ 0 , 1 ] B(t)=(1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3, t\in[0,1] B(t)=(1t)3P0+3(1t)2tP1+3(1t)t2P2+t3P3,t[0,1]
该公式通过给定的控制点的坐标计算出了曲线上参数t对应的点的坐标。其中每个控制点的系数就是伯恩斯坦多项式(Bernstein polynomials),其伯恩斯坦形式图形如下:
B n ( t ) = ∑ i = 0 n B i n P i , t ∈ [ 0 , 1 ] , n 是 控 制 点 的 个 数 , B i n 是 伯 恩 斯 坦 多 项 式 B^n(t)=\displaystyle \sum ^n_{i=0}B^n_iP_i, t\in[0,1], n是控制点的个数,B^n_i是伯恩斯坦多项式 Bn(t)=i=0nBinPi,t[0,1],n,Bin
在这里插入图片描述
矢量字体就是使用贝塞尔曲线和绘图指令表示的。
贝塞尔曲线的性能

  1. 起点和终点的坐标和切线方向是确定的;
  2. 各项系数之和为1
  3. 对称性和递归性
  4. 仿射变换性质:可以通过控制点来变换曲线,在几何上对贝塞尔曲线做仿射变换相当于对其控制点做仿射变换再求对应的贝塞尔曲线;
  5. 凸包属性(曲线在控制点的凸包内)。

分段贝塞尔曲线 Piecewise Bezier Curves
n n n非常大的贝塞尔曲线很难控制,所有就需要分段了。那怎么分段呢?为了段和段之间平滑过渡,前一段的终点和后一段的起点保证切向量一致。
关于连续性G1 G2 G3的区别
描述曲线、曲面的连续方式,以及平滑程度。
G0:曲线无断点,曲面无缝隙无孔洞;
G1:一阶导数 d y / d x dy/dx dy/dx连续;
G2:曲率(单位弧段上切线转过的角度大小) d α / d s d\alpha/ds dα/ds连续;对曲线做曲率分析,曲率曲线连续无断点,对曲面做斑马线分析,斑马线平滑无尖角。
G3:曲率相切连续;对曲线做曲率分析,曲率曲线连续且平滑无尖角,即一阶导数连续。
在这里插入图片描述
C0、C1、C2连续应该是指0-1-2阶导数连续。
关于光顺性

样条:可控的曲线
B样条:可以理解为对贝塞尔曲线的扩展,贝塞尔曲线如果其中一个控制点移动了,整个曲线都改变了。我们需要一种较好的局部性质。

贝塞尔曲面

http://netclass.csu.edu.cn/NCourse/hep089/Chapter3/CG_Txt_3_019.htm
四条贝塞尔曲线,分别通过参数 u u u确定四个点,然后以这四个点为控制点确定一条贝塞尔曲线,好多曲线就构成了一个曲面。
在这里插入图片描述

第十二次课

Mesh Subdivision 网格细分

增加点,产生更多的三角形,改变新增点和原有点的位置。
Loop Subdivision
Split each triangle into four;Assign new vertex positions according to weights New / old vertices updated differently。
在这里插入图片描述
在这里插入图片描述
Catmull-Clark Subdivision
Loop Subdivision 只能细分三角形网格,而 Catmull subdivision 可以对一般的网格细分。
在这里插入图片描述
在这里插入图片描述
经过一次操作之后,奇异点的个数加倍;之后的操纵不会影响奇异的的个数。
在这里插入图片描述

Mesh Simplification 网格简化

Collapsing An Edge
在这里插入图片描述将一个面简化为一个point:每个face计算一个Quadric Error Metrics (二次度量误差),通过这个数的大小判断这个face是否要简化。

Mesh Regularization 网格标准化

Shadow Mapping

判断某个点是否为影子:观察两次,第一次从eye视角看,每个点记录depth,通过变换把这个depth转换为光源视角下的depth,和实际光源视角下的该点的depth比较,如果前者更大那么该点为影子。
在这里插入图片描述
Visualizing Shadow Mapping
问题:实际光源不是点光源,影子是软阴影。
在这里插入图片描述

  • Hard shadows (point lights only)
  • Quality depends on shadow map resolution (general problem with
    image-based techniques)
  • Involves equality comparison of floating point depth values means
    issues of scale, bias, tolerance

第十三次课

光栅化对一些全局属性不友好,例如软阴影、光的反射不止一次。
光栅化比较快,但是质量低;光线追踪计算量很大,很慢,多用于离线渲染。
Rasterization: real-time, ray tracing: offline。

Recursive (Whitted-Style) Ray Tracing:光线是可逆的,从眼睛或者相机向每一个像素方向发射一束光线,经过物体的反射/折射到达光源。
在这里插入图片描述
那么如何求光线和三角形的交点呢
光线的表示: r ( t ) = o + t d , 0 < t < 1 。 o 表 示 起 点 , d 是 单 位 向 量 , t 表 示 传 播 时 间 r(t) = o + t d, 0 < t < 1。o表示起点,d是单位向量,t表示传播时间 r(t)=o+td,0<t<1odt
与三角形求交点可以转化为和平面求交点,然后判断该点是否在三角形里面。
在这里插入图片描述
有没有更快的求解方法呢?
在这里插入图片描述
关键问题是这样做计算量非常大,如何加速计算?
用一个Bounding Volumes(包围盒)把物体框起来,这样如果光线没有穿过包围盒就不用判断里面的三角形。
常用的是Axis-Aligned Bounding Box (AABB)(轴对⻬包围盒),便于计算。那么如何计算光线是否经过包围盒呢?
将一个立方体看成三个对面的交集,先计算光线与每个对面的交点得出三对 t m i n 和 t m a x t_{min}和t_{max} tmintmax,然后求交集就是光线在包围盒里面的时间。
t e n t e r = m a x ( t m i n ) , t e x i t = m i n ( t m a x ) t_{enter} = max(t_{min}), t_{exit} = min(t_{max}) tenter=max(tmin),texit=min(tmax)
当且仅当 t e n t e r < t e x i t 并 且 t e x i t > 0 t_{enter} < t_{exit} 并且 t_{exit} >0 tenter<texittexit>0,光线穿过AABB形包围盒。(如果 t e n t e r < 0 并 且 t e x i t > 0 t_{enter} < 0 并且 t_{exit} >0 tenter<0texit>0则光线的起点在包围盒内)

第十四次课 加速求交

思想:将一个大的包围盒(包含好多物体)划分成很多小的包围盒;如果均匀划分,由于某些区域物体稀疏而某些区域物体密集,加速效果并不好,另外一个物体可能会处在不同的几个包围盒中,这也不太好;于是就基于物体个数,每次划分尽量使得两部分包含的物体个数一致。

Uniform Grids 均匀网格

在这里插入图片描述
缺点:
网格划分多少合适呢?根据经验, c e l l s = C ∗ o b j s ( 物 体 个 数 ) , C ≈ 27 i n 3 D cells = C * objs(物体个数), C ≈ 27 in 3D cells=Cobjs(),C27in3D
对于物体均分分布的画面效果不错,但是对于物体分布某处很密集而某处很稀疏的画面效果很不好。采用空间划分方法解决这个问题,Spatial Partitioning Examples:Oct-Tree, KD-Tree, BSP-Tree.
在这里插入图片描述

Oct-Tree

上图其实是一个二维空间的四叉树结构。三维空间才是一个八叉树,那么 n n n维空间就是 2 n 2^n 2n叉树,太复杂了。

BSP-Tree

三维空间需要用一个平面切分,不容易处理。

KD-Tree

在这里插入图片描述
依次划分每个维度(沿着x轴一分为二,沿着y轴一分为二,…x,y,…),结果就类似于二叉树。与光线求交,先判断光线与A是否相交,若相交,判断与1是否相交(若相交,判断光线与1中每个物体是否相交),然后递归B。
问题:一个物体可能处在多个盒子中,那么一个三角形也可能处在多个盒子中,这时候就三角形和光线是否相交就很难(例如:Triangle的三个顶点都不在盒子中,但是它和盒子相交)。

Object Partitions & Bounding Volume Hierarchy (BVH) 物体划分BVH

BVH是目前广泛使用的结构,通过物体个数划分,依次划分每个维度。二维情况如图:
在这里插入图片描述
找到一个包围盒,递归将其分成两个子集并重新计算子集的包围盒,在某一条件下停止。所有的物体都处在叶子节点中。
划分子集的时候,最好是两个子集包含的物体个数尽量相同,保证是一个平衡树。做法是计算每个三角形的重心,然后找出中位数。快速选择算法

第十五次课

Radiometry 辐射度量学

还记得在Blinn-Phong模型中的 light intensity I I I, 它没有单位。
Measurement system and units for illumination
Accurately measure the spatial properties of light
New terms: Radiant flux, intensity, irradiance, radiance

intensity, irradiance, radiance

单位时间单位立体角的能量;单位面积的能量;单位立体角单位面积的能量。
https://www.bilibili.com/read/cv6938495/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

represents how much light is reflected into each outgoing direction w r w_r wr from each incoming direction
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对反射方程的理解:
在这里插入图片描述
人眼看到的 = 物体自身发光量 + 每个面光源经过物体反射的光量
在这里插入图片描述
另一种理解方式:经过复杂的简化推导,人眼看到的 = 物体自身发光量 + 一次弹射的光 + 二次弹射的光 + …
类似于泰勒展开,实际上不需要计算那么多分量就可以近似。

第十六次课

对于定积分,某些函数很难计算,采用蒙特卡洛积分近似。对自变量进行采样,然后求和;采样可以是均匀的,也可以不是,有很多研究。下面式子中的 p p p表示概率密度函数。
在这里插入图片描述
Whitted-Style Ray Tracing 存在的问题:对于光滑镜面和磨砂镜面都是执行了镜面反射;没有考虑光线弹射。
在这里插入图片描述
在这里插入图片描述
假设每个pixel采样100个点,计算直接光照需要100次计算,而计算间接光照(二次弹射)需要10000次,这样计算量就很大。
在这里插入图片描述

于是 路径追踪(Path Tracing) 应用而生

如果只考虑一条光线,计算量就不会翻倍。这就是Path Tracing。
而对于递归的终止条件我们采用俄罗斯轮盘赌(Russian Roulette (RR))思想,其实就是以一定概率终止。
只考虑一条光线,每次随机方向,那么势必有很大的噪声。而每次随机选择一个方向进行path tracing,会造成很大一部分ray打在空旷的地方而浪费计算量。我们之前考虑的是采样一个pixel,如果采样光源呢?
在这里插入图片描述
假设光源是一个面光源,建立 d w 和 d A dw和dA dwdA之间的换算关系,就可以将之前的着色方程用到光源上。
在这里插入图片描述
以前我们说的 Ray Tracing 就是指 Whitted-style ray tracing;而现在的光线追踪包含了一般的light transport、path tracing、photon mapping、Metropolis light transport、VCM / UPBP…
没有讲到的问题:
如何采样一个函数?
蒙特卡洛积分选择哪种概率密度函数(pdf)更好?importance sampling
随机数的产生方法有没有好坏之分呢?low discrepancy sequences
采样pixel的半球面和采样光源两种方法能否结合?multiple imp. sampling
从pixel发出的不同path,得到radiance,为什么取平均?要不要加权?(pixel reconstruction filter
如何将radiance换算成颜色?gamma correction, curves, color space

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页