课程链接:GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
一.概述
课程主体
Course Topics
1.Rasterization 光栅化
2.Curves and Meshes 曲线和网格
3.Ray Tracing 光线追踪
4.Animation/Simulation 动画/模拟
1.图形学不涉及推断推演,属于计算机视觉的内容。
2.2D→3D属于计算机视觉,3D→2D偏向图形学。
二.Review of Linear Algebra线代综述
1.点乘
两向量通过点乘判断方向(大于0同向,小于0反向)。
通过点乘判断距离。
2.叉乘
判断左右。
a X b 若为正,代表b在a的左侧,即a经过不到180°的逆时针旋转可以与b的方向一致。
判断内与外。
用三角形三顶点与P点组成的向量:如AP和AB,判断AP是否在AB左侧,同理判断其余两边都在左侧。(或三边都为右侧同样可以。)
三.Transformation
引入齐次坐标系,将二维平面的坐标升维,统一形式表示,描述可包含平移的仿射变换。
(先线性变换,再平移变换)
1.View/Camera Transformation 视图/相机投影
三维坐标具有轮转对称性,导致Ry(α)的特殊。(xyzxyzxyzxyz y←zx而不是xz)
Rodrigues旋转公式:把三维空间中任意旋转分解为xyz轴三个方向的旋转
2.Projection Transformation 投影变换
1.Orthographic projection 正交投影
将任意大小的立方体根据变换转化为(-1,1)^3的标准立方体
2.Perspective projection 透视投影 (近大远小性质)
根据透视投影的特性,在z面投射到z'面的过程中,x与y坐标的变化适用于相似三角形,即总可以根据相似比例确定投射后x'及y'的相对于z的对应位置。
忽略z的变化,因为在投影过程中,z和z’平面的位置是确定不变的,无需考虑。
因此我们可以确定变换矩阵第三列前两个参数一定是0:
此时还剩AB两个参数没有确定,我们利用z和z'平面的中点,如下图的n和f(这两个特殊点在变换矩阵的作用下的位置总是不变的),联立方程即可解出A和B的值:
到此为止,我们的透视投影到正交投影的变换矩阵 M persp→ortho 就得出了,作用便是将平面z'挤压为平面z的大小(在z'的平面内完成挤压,并且规定z'的中点是不变的),而后我们在乘以M ortho,便可将挤压后的平面投射到预设的位置。
四.Rasterzation
1.Triangles
屏幕就是像素的数组,光栅化意为在屏幕上绘制。
像素是一个个小方格,颜色是均匀的(红绿蓝)
限制屏幕大小为(width,height),则像素Pixel的索引范围从(0,0)到(width-1,height-1)
视口变换viewport
将不含Z方向的XY屏幕中[-1,1]^2转换为屏幕空间[0,width] x [0,height]
LCD液晶显示
利用光的波动性,扭曲偏振光
在某个点取连续函数的值称为采样。
2.MSAA
在像素内部增加多个采样点进行处理
3.Z-Buffer
画家算法Painting Algorithm
对深度排序后绘制,处理不了交叉堆叠问题
深度缓存Z-Buffer
深度缓存按像素处理,同时绘制帧缓存和深度缓存
在光栅化中遍历每一个三角形,对于该三角形中每个像素,记录它的最浅深度(z小于缓存则更新当前rgb到帧缓存中,并更新深度缓存。
对每个像素遍历并记录深度最小值
Z-Buffer算法复杂度:o(n)
五.Shading
对于shading只考虑local,即在该点的各种光照数值,不考虑别的点或物体的存在。(着色具有局部性,着色不等于阴影)
1.漫反射Diffuse Reflection
光照与物体法线的夹角决定了光的亮度
ld:漫反射光
kd:扩散系数(颜色)rgb
I/r^2:点光源到达该shading point的能量
max(0,n*l):取非负数,使计算有效,法线与光源的余弦值
漫反射与观察方向无关
2.镜面反射Specularly Reflected Light
光照照向接近光滑的物体表面产生反射光v,这个v与真正的镜面反射光R会产生一个夹角
引入半程向量的概念,直接求l与v的角平分线向量h,该向量会与法线向量n产生一个夹角α,以此度量v与R的偏差,方便计算。当n和h足够接近时,可以看到高光
ks:镜面系数
p:控制对可见高光范围的容忍度
镜面反射与观察方向有关
3.环境光照Ambient Term
环境光与观察方向和L无关,是一个常数
布林冯着色模型=环境光+漫反射光+镜面高光
4.着色频率Shading Frequencies
1.逐三角形着色Flat shading
2.逐顶点着色Gouraud shading
顶点法线向量的计算
对该点相邻三角形求法线,进行加权(一般是三角形面积)平均
3.逐像素着色Phong shading
像素法线向量的计算
利用重心坐标
5.图形管线Graphics(Real-time Rendering)Pipeline
着色器Shader
定义Shading中每个顶点或者像素如何操作
6.纹理映射Texture Mapping
三角形的任何一个顶点都规定了对应在纹理上的坐标。
在纹理上的坐标系(u,v)
7.重心坐标Barycentric Coordinates
插值计算
为什么要进行插值计算?
1.获取顶点坐标
2.在三角形中获得平滑变化的值
插值计算些什么?
纹理坐标,颜色,法向量等
如何计算?
利用重心坐标
三角形平面内任意一点都可表示成顶点坐标的线性组合
也可以利用三角形面积比求出
1.双线性插值Bilinear interpolation
如图所示,黑色点阵代表texel纹素,红点代表某个像素映射到纹理的位置,对其相邻4个纹素,在水平方向应用两次插值获得两个点后应用竖直方向的插值,即可得到最终平滑过渡的值。
2.Mipmap
当距离过远时,一个像素可能覆盖多个纹素,会导致走样。
为解决大纹理导致的走样问题,同一纹理生成的多张(log)分辨率不同、大小成倍缩减的纹理。
用于正方形范围内的范围查询
开销是原本的三分之四
如上图所示,要求出(u,v)像素点对应的纹理映射,可以采取近似法:
(1)找到其邻居节点对应的纹理坐标
(2)求出该点与邻居节点在纹理坐标上的距离,并取最大值
(3)在uv系下以该值为边长,该点为中心生成正方形
(4)计算D=log2L,该D表示在第几层的mipmap中,该区域会被映射为1x1的像素
(5)直接取mipmap第D层的值作为结果
3.三线性插值Trilinear Interpolation
在Mipmap第D层和第D+1层同时应用双线性插值后对结果合并再进行一次插值。用于D非整数的情况
4.各向异性过滤Anisotropic Filtering
mipmap在某些情形下会使得远处过于模糊,产生overblur
mipmap处理正方形,而无法处理长或宽被压缩的矩形。相比mipmap各项异性过滤有各个方向的压缩矩形,可查询矩形而非限制在正方形。(开销是原本的三倍)
各向异性过滤允许对以上所示长条形区域作快速的范围查询,而非是大范围的正方形mipmap查询。*(但对斜着的区域还是解决不了问题)
EWA Filtering
将任意不规则形状拆成多个圆形覆盖该形状,多次查询。精准但费时。
8.纹理的作用
1.环境光照
存储环境光
2.凹凸贴图Bump Mapping
纹理可以定义在每个顶点上的相对高度,(法线变化),实现复杂几何的简单表现
1.在不增加三角形的情况下添加表面细节
2.每个像素对其法线进行扰动(只用于着色计算)
3.由纹理定义每个texel的高度偏移
如何修改法向量?
用凹凸贴图定义切线,并逆时针旋转90度,就是法线
3.位移贴图Displacement Mapping
真实改变了三角形顶点的位置
4.3D程序化噪声Procedural Noise
空间中任意一个点都定义了纹理,并通过函数计算出右图,而非实际贴在了物体表面
5.阴影
纹理可以记录一些计算好的信息,并且用于在Shader中进行解释
6.3D体积渲染
9.阴影Shadow Mapping
处理点光源投射的阴影(硬阴影)
关键思想:处理某个点并非同时被光源和摄像机看到
具体分两步:
1.第一次投影。认为光源处有一个虚拟相机和一张虚拟场景图。从光源向场景看去,记录每个点所能看到的最大深度。
2.第二次投影。实际从相机出发,渲染出实际场景,并将所求点重新投影回虚拟场景,寻找该点在虚拟场景中的可视深度,与其实际深度作比较,即可看出该点是否在阴影中。 (两趟光栅化)
软阴影不可能存在于点光源(本影,半影的过渡)
六.Geometry
1.隐式几何implicit
定义表达式,找出所有符合该表达式的点。
隐式几何优点:
1.方便表述
2.易于一些查询(到面距离,是否在物体表面等)
3.适用于射线到曲面的相交
4.对于简单的形状描述精确,没有采样误差
5.易于处理拓扑中的更改
缺点:
难以对复杂形状建模
1.距离表述几何Distance Functions
定义距离函数,不直接描述几何表面,而是描述任何一个点到这个表面的最近距离。
分别对两个几何求距离函数,进行blend
(水平集)当距离函数等于0时,还原(提取)出几何体表面,类似等高线。
2.显式几何explicit
确定二维坐标,而后映射到三维
1.点云Point Cloud
把三角形面离散成点,表示表面的每一个点。
2.多边形网格Polygon Mesh
存储顶点和多边形(通常是三角形或四边形)
易于处理/模拟,自适应采样
更复杂的数据结构
图形中最常见的表示形式
3.曲线和曲面Curves and Surfaces
1.贝塞尔曲线(显式表示)
d.c.算法
找到某个时间t在贝塞尔曲线上的点
1.在b01,b12上找到t
2.连接这两个t,再从该线段上找到b02,该点即为所求点
整条曲线上任意一点都可以由初始的b0,b1,b2三个点和参数t表示。此处系数为1的展开
(1-t+t)
伯恩斯坦多项式(二项式展开)
贝塞尔曲线的性质
1.一定过起点和重点
2.对于三次贝塞尔曲线(4个控制点),确定了起始方向是三倍切线。
3.仿射变换性质 可通过变换控制点变换曲线
4.凸包性质 曲线在控制点的凸包内
补充知识:b-样条,b-splines,NURBS
2.贝塞尔曲面
4x4网格给定16个控制点,做出4条贝塞尔曲线,而后通过不同时间t确定4个点,并将这4个点认为是贝塞尔曲线的控制点,做出新的贝塞尔曲线,利用该曲线伴随时间的移动得到一个曲面。
该面需要两个时间参数u,v,一个水平方向一个竖直方向,u找线,v找面
由于贝塞尔曲面是参数u,v表示的,所以它是显式表示。
4.细分Subdivision
1.Loop Subdivision
思想:先细分,再调整
新生成的点是其周围几个值的平均
老顶点的变动一部分受到自身影响,保留自身的一部分属性,另一部分受该顶点的度影响(周围节点的平均)
2.Catmull-Clark Subdivision(General Mesh)
非四边形面
奇异点(度不为4的点)
更新规则
5.网格简化
1.边坍缩collapsing an edge
使用动态优先队列/堆,储存二次度量,每次取最小的边,而后更新。
七.Ray Tracing
Recursive(Whitted-Style) Ray Tracing
模拟光线不断弹射的过程,在其每一个交点求着色和阴影而后加和。
1.Ray Equation
1.光线和隐式表面求交
2.光线和显示表面求交
(1)判断光线和三角形所在平面的交
(2)判断交点是否在三角形内
一步到位法:
利用重心坐标
2.Bounding Volumes
加速光线三角形求交
简化光线和三角形求交,使用AABB包围盒
思想:将AABB视作三对平行平面,在二维场景中,(xoy)为例子,从光源分别计算到x0x1,y0y1这两对平行平面的进入和移出的时间,而后求这两个时间的交集,得到光源实际进入和移出盒子的时间。
扩展到三维场景:光线何时进入和离开box?
只有当光线进入到所有三个对面,才算进入盒子。光线离开任意一对对面,就算离开盒子。
算法:
1.对于每对对面,各自计算最大和最小进入离开时间。
2.求所有三组进入时间的最大值,离开时间的最小值。
3.当t进入<t离开,说明该段时间光线在盒子里。
处理t<0时:
加速思想:多做光线与box求交,少做与物体求交
1.KD-Tree
1.光线和包围盒求交点
2.若有交点,和其左右子树分别求交点
3.递归,直到求到叶子节点,并判断光线和叶子节点内每个物体是否有交点
缺陷:一个物体可能被多个叶子包含,判断费时。
2.Bounding Volume Hierarchy (BVH)
划分的不是空间而是物体
给物体分类,一个物体不可能同时在两个盒子里。
快速划分算法
KD-Tree和BVH的比较
空间分区(例如KD树)
1.分割空间
2.不重叠区域
3.对象可以包含在多个地区
对象分区(例如BVH)
1.将一组对象划分为不相交子集
2.每组的边框可能在空间上重叠
3***.辐射度量学Radiometry
辐射通量Radiant flux:功率(Q对时间t的导数)
Radiant Intensity:辐射强度,表示从光源任意方向看去,光照强度的大小
立体角:空间中的一个角度
dA表示面积微元
dw表示微分立体角
1.辐照度Irradiance
定义:单位面积上的辐射通量(每个面积上收到的能量)
辐照度与光线和平面所成角度有关
2.辐射亮度Radiance
定义:描述光源发出的光强度在特定方向上的分布情况的物理量
辐射亮度的定义涉及到几个关键概念:
- 辐射功率(Radiant Power):也称为辐射通量,是单位时间内辐射能量的量度,用瓦特(W)作为单位。
- 单位面积:辐射亮度考虑的是通过某个特定方向上单位面积的辐射功率。
- 单位立体角:立体角是三维空间中角的概念,与平面角相似,但它测量的是某点周围空间区域的大小。单位立体角内的辐射亮度反映了光源向该方向发射光的能力。
辐射亮度的单位是瓦特每平方米每球面度(W/m²·sr),其中“sr”表示立体角的单位“球面度”。
3.BRDF
双向反射分布函数:Bidirectional Reflectance Distribution Function
双向反射分布函数(Bidirectional Reflectance Distribution Function,简称BRDF)是用于描述光在被物体表面反射时方向分布特性的函数。它是计算机图形学、光学和视觉感知领域中用于模拟和理解光与物体交互的重要工具。BRDF具体定义了入射光线如何被表面材料反射到不同方向上。
基本概念
BRDF的定义涉及以下几个关键概念:
- 入射光线:光线落在物体表面的方向。
- 反射光线:光线从物体表面反射出去的方向。
- 辐射亮度:表面在特定方向上反射的光的强度。
- 入射辐照度:落在物体表面的光的强度。
渲染方程
why Ray Tracing?
相较于光栅化更好解决间接光照
4.蒙特卡洛路径追踪
从均匀分布扩展到一般情形,除以每个点的PDF后求和。
The Utah teapot
采用蒙特卡洛积分解渲染方程
如果只在着色点采样,打出去大量光线若不命中光源会造成大量的浪费。如何解决呢?
想办法直接在光源上采样:将对dw的积分转换为对光源上dA的积分
立体角本身是不变的,只不过转化为在dA处求。
对于来自于光源的贡献:用从光源采样来做
对于所有非光源对于该点的贡献:使用RR的普通采样来做
整个流程
七.Materials and Appearances
1.Material
Material==BRDF
漫反射材质
不计损失,入射的irradiance等于出射的irradiance,故入射的Radiance应等于出射的Radiance
Glossy材质反射
透镜反射/折射
1.折射Refraction
当入射介质的折射系数大于出射时会发生全反射。
2.菲涅尔项Fresnel Terms
3.微表面模型Microfacet Material
远处看是外观,近处看是几何
微表面模型的BRDF
D(h)表示考虑什么样的微表面才能把入射反射到对应的出射,换句话说,即满足这对入射出射所对应的half vector对应于该微表面有多少满足的half vector。
4.各向异性和各向同性
微表面材质中,各向同性法线分布相对均匀,而各向异性法线分布具有一定明确的方向性。
特殊而有趣的各向异性材质:velvet天鹅绒