全局光照做的好不好影响游戏美术品质,同时体现在场景的亮度
图形学的技术挑战光栅化(rasterization):
将三维空间中的几何形体显示在屏幕上
实时:30fps 否则被成为离线
曲线和网格(Curves and Meshes) :各种细分方法
光纤追踪(ray tracing):动画电影广泛使用,但是速度较慢
目前使用游戏使用的是实时光线追踪
仿真和模拟(animation/simutatoin)
OpenGL、dx是图形学API不是图形学
计算机图形学与计算机视觉图形学不是计算机视觉。计算机视觉:猜测、预测、分析处理计算机视觉是理解这个世界,计算机图形学是创造这个世界线性代数复习图形学默认使用列向量,课程默认为右手系
点乘在图形学的应用AB=|A||B|cosθ
点乘主要应用于求两个单位向量的夹角,观察两个向量之间是同向、垂直还是反向,可以观察两个向量的接近,若两个向量的点乘接近1则离得很近,若接近0则离得很远利用投影可将一个向量分解成两个(多个)向量和叉乘在图形学的应用AxB=-BxA判定左右(内外)若AxB为正则点A在点B在A左侧,若点P在点A、B、C内,则ABXAP,BCxBP,CAxCP结果都为外(内)则P在ABC内若任意一个结果不同则P在ABC外定义坐标系要求:单位向量、互相垂直(点乘为0且叉乘结果为另外一轴)可以获得任意一个向量分解为多个投影矩阵知识点(MxN)(NxP)=(MxP)矩阵没有交换律,只有结合律转置:(AB)T=BT AT单位矩阵I(对角阵I):可以算出矩阵A-1(A逆),可以用于返回变换前的结果向量的点乘、叉乘都可以转换为矩阵相乘点乘:A·B=ATB叉乘:AxB=A*B概率论复习(用于路径追踪)X:随机变量
pi一定是非负的,所有pi相加等于1
EX:数学期望
X~P(X):概率密度函数,概率的连续分布情况
变换2D 变换缩放X'=SXY=SYX轴翻转X'=-XY'=Y切变旋转R-θ=RθT
齐次坐标为了解决平移产生必须要用加法的问题,加入齐次坐标。
矩阵没有交换律:同时需要平移和线性变换的时候,需要先线性变换再平移仿射变换=线性变换+平移3D 变换齐次坐标3D点:(x,y,z,1)T
3D向量:(x,y,z,0)T
旋转向量与欧拉角RXYZ(α,β,γ)=RX(α)Ry(β)Rz(γ)
利用右手螺旋定则在三维坐标系中:
XxY=Z XxZ=-Y YxZ=X
因此RY(α)中为X或Y的转置
同时,去掉分别代表XYZ运算的行列即可变换为最基本的旋转式
罗德里格旋转公式这是一种可以表示任意旋转后的向量
四元数解决了两个旋转角度中插值的问题,本课中不具体讲解
视图变换什么是视图变换?视图想想如何拍一张照片:
找一个好的地方并安排好拍照的人(模型变换)找一个好角度并放好相机(视图变化)茄子!(投影变换)定义相机position(相机在哪)elook-at/gaze direction(朝哪个方向)gup direction(向上方向:控制歪斜)t同时,相机默认的向上方向为+Y。永远朝着-Z方向看,永远在原点上。
把任意点相机移到默认点先平移再旋转(利用逆矩阵的性质,先算从原点到任意点再转置过来)(g x t = e)
投影变换正交投影:更像工程制图,没有近大远小的性质 透视投影:近大远小,更类似于现实中的形态
正交投影一种简单的理解方式把z轴去掉相机位于原点,看向-Z轴,向上为Y轴将生成的矩形平移并缩放为[-1,1]²标准方式总的来说,要将任意的立方体变成标准(canonical)立方体
先做平移,再做缩放
透视投影如何做透视投影?将视锥体压扁成立方体做正交变换“压扁”操作其中:
n为近平面
f为远平面
利用相似三角形求出y轴的位置
同理可以得到x‘=(n/z)x
Z轴如何处理?当我们完成X、Y轴处理后,发现Z轴仍不知道,同时乘z后得到右下的矩阵
同时可以通过矩阵叉乘得到未知矩阵的一部分:
(?,?,?,?))->(0,0,?,?)
再通过下图的方法得出原本“still unknown”的数值为n²
以此得到:
An+B=n²
同时z轴在远平面上的数值并不会改变,因此得到:
Af+B=f²
通过解上面两个方程得到:
A=n+f
B=-nf
因此Z轴一行的矩阵为:
(0,0,n+f,-nf)
光栅化如何定义视椎体宽高比和垂直可视角度?fov:垂直可视角度
t:在y轴的高度
n:近平面上的z轴上的点
tan(fov/2)= t/|n|
r:中心点到右边的距离
宽高比(aspect) = 2r/2t = r/t
如何将投射完成的标准立方体显示到屏幕上?什么是屏幕?二维数组每个元素是一个像素一种经典的光栅成像设备光栅化:在屏幕上绘画
像素:
在屏幕上最小单位的小方块由红绿蓝三原色混合而成屏幕空间像素都是以(x,y)的形式表示,其中x、y都是整数像素的范围从(0,0)到(宽度-1,长度-1)像素的中心在(x+0.5,y+0.5)屏幕覆盖范围为(0, 0) 到 (宽, 高)视口变换Z轴被忽略将原本【-1,1】²的正方体变换为【0,宽】x【0,高】(视口变换)视口变换矩阵光栅显示设备阴极射线管隔行扫描方法CRT显示器示波器帧缓冲器平板显示设备LCD(液晶显示器)OLEDLED(发光二极管)电子墨水屏三角形-基本形状单元最基础的多边形任何多边形都可以独特的性质除非折成两个三角形,否则永远是一个面三角形的内外很明确可以利用重心插值进行三角形顶点插值采样在某个点对函数求值就是采样,我们通过采样将函数离散化。
Inside函数inside(tri,x,y)
1:point(x,y)在三角形内
0:其余情况
遍历所有点,判断所有点是否在像素内
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);}}通过叉乘计算出(见叉乘在图形学的应用)点是否在三角形内
如果碰巧点在三角形的边界,本课程中不做处理,也可以特殊处理
包围盒优化利用包围盒(Bounding Box)对一定不会包含三角形的像素进行优化
对于窄长的三角形并不友好
采样的瑕疵锯齿通过inside函数渲染出来的三角形有明显锯齿
抗锯齿是图形学中重要的难题
通过对原本三角形做模糊处理再进行采样可以抗锯齿(反走样)
不能先采样再做模糊
之所以会出现锯齿(走样)是因为出现了频谱混叠(后面有讲)
摩尔纹车轮效应信号时间变化太快以至于采样跟不上变化的速度
时域与频域频域是描述信号在频率方面特性时用到的一种坐标系
时域是描述数学函数或物理信号对时间的关系的一种坐标系。
傅里叶级数展开傅里叶变换会将时域转化为频域
将函数表示为正弦余弦的加权和
随着展开式越来越多,越来越接近我们想要表达的函数
如果采样的频率不够,还原过来的函数就会越来越不精准
频域和时域可以通过傅里叶变换和逆变换互相转换
傅里叶频域图滤波删除特定的频率被称之为滤波
高通滤波:只显示高频信息(只显示边界-锐化,将低频信息盖住
低通滤波:只显示低频滤波(画面变模糊,将高频信息盖住
卷积滤波=卷积(=平均)
简化的定义:结果为相邻数的平均值
定理:时域的卷积等于频域的乘积
频谱混叠由于采样稀疏,因此出现频谱混叠从而出现锯齿(走样)如果屏幕中像素非常多,密集的采样就不容易出现走样。
因此使用分辨率高的显示器,频谱的搬移间隔大,不容易出现频谱混叠。
同时,将信息进行低通采样再进行采样即可反走样。
反走样(抗锯齿)解决方法:
通过将每个像素进行模糊卷积f(x,y)卷积=滤波=平均然后再对灭个像素的中心取样在光栅化一个三角形时,像素颜色的平均值f(x,y)= 三角形的覆盖像素的面积
超采样抗锯齿(MSAA)MSAA: Antialiasing By Supersampling
这是一种对反走样的近似
将每个像素的内部多增加采样点再进行模糊卷积
MSAA X4
缺点:增加了很多的计算量
其他的抗锯齿方法FXAA (Fast Approximate AA)快速近似抗锯齿图像的快速处理TAA (Temporal AA)对上一帧进行处理超分辨率从低分辨率处理成高分辨率
与反走样类似,也是解决了样本不足的问题
目前可使用DLSS(深度学习的方法)进行超分辨率处理
画家算法灵感来源于画优化
先画(渲染)距离远的,再画(渲染)距离近的。
问题:难以确定谁在前谁在后
深度缓冲(Z-Buffer)深度图-储存每个像素对应的最浅的深度结果图-储存最终的结果特别定义:Z越小(越黑)越近,越大越远(与通常的右手系不同,仅仅为了便于理解)
算法:
//默认深度为无限远for(each triangle T){for(each sample(x,y,z) in T)//遍历任意一个三角形中的任意一个像素{if(zb力的方向,是归一化问题:由于没有阻力会永远震荡加入阻尼力:再讲内容之前先普及一点:x为位移,x上一点是速度(一阶导数)点两个点是加速度(二阶导数)f是阻尼力,b加上一点是速度,kd是劲度系数问题:无法描述弹簧内部的力完善的阻尼力:红框为b与a相对速度在b与a方向上的投影,是一个标量红框右边是a到b的方向问题:这样的弹簧系统无法应对对折的情况(比如讲一块布对折)
解决:通过加入斜向的弹簧来解决这样的问题。
问题:这样的弹簧系统无法应对沿着弹簧竖着对折的情况
解决:加入跳跃连接的点,隔一个支点加一个弹簧,这个弹簧十分的弱
有限元法FEM方便制作力的传导应用于车辆碰撞的模拟粒子系统粒子生成步骤生成粒子计算每个粒子的力(难点)更新每个粒子的位置速度将死亡的粒子移除渲染粒子之间的作用力引力与斥力重力电磁力阻尼力摩擦空气阻力粘度碰撞墙壁容器物体应用通过制定规则让粒子表现群体的个体之间的关系
鸟群每个个体的鸟不愿意落单同时不愿意离群体太近方向相对统一细胞结构...单个粒子的模拟获取单个粒子的速度场,获取场内任意位置的速度参数
计算速度场内粒子的位置需要计算一阶常微分方程
欧拉方法对时间做离散化的操作,利用欧拉方法(前向欧拉)获取每一个时刻的速度和位移
问题:误差大、稳定性不足,如果步长不足则会不准确,且对于一些曲线的模拟十分不准确,一定会正反馈,其中不稳定的问题很致命
解决:
中点法自适应改变步长的方法隐式法不基于物理的方法:基于位置法、韦尔莱积分中点法在初始点使用欧拉方法计算出下一位置的a点在初始点与a点总取中点b再使用b点的速度来求出初始点下一位置c点中点法完整公式:
自适应步长计算两遍,一次是Δt,一次是Δt/2来进行欧拉方法
若两遍的结果相差较大,则应将步长减半重新计算
隐式欧拉方法联立方程组解出结果(假设下一个时刻的加速度已知)
龙格库塔法是一种四阶的方法,稳定性相对来说比较好。
中点集合k、k2、k3、k4通过下面的方法进行计算得到下一时刻的位置。
不基于物理的方法比如基于位置法、韦尔莱积分等方法该方法不保证能量守恒只通过调整某些位置,使其能够满足模型中的一些特定性质。是一种不稳定的方法,但是简单且实现时间快。如何判断方法是否稳定?通过研究局部截断误差O(h2)和总体累积误差O(h)来确定稳定性当在局部上讲Δt变为1/2Δt时,在全局上Δt会变为1/4Δt因此阶数越高越好,减少阶数,误差可以成倍的减小运动学分为正向和反向,模拟的是真实的骨骼运动
正向运动学关节类型:
可以绕着关节2维的旋转可以绕着关节3维的旋转可以拉长一部分的关节我们可以通过参数很容易计算出p点的坐标,通过改变参数来实现骨骼的动画就被称为正向运动学
因为这样的操作十分不直观,艺术家们不愿意通过这样的方式来调节模型的骨骼,因此逆运动学应运而生
逆向运动学通过直观的控制尖端p点来直接控制参数,这样操作的计算量相对正运动学相比明显增大
问题:
解并不唯一:有多个可能性造成p点在所在坐标无解:p点不可能在指定的坐标解决:我们通过随机化算法(优化方法、梯度下降)等方法来解决问题,并不使用纯数学的方法来暴力解决
例子:Style-Based IK
骨骼绑定在模型上增加控制点,让人们能够方便的调整模型的动作
对于同一个模型的两个动作,通过控制点间的位置插值计算来完成,这被称为“Blend Shapes”
动作捕捉在真人身上放置控制点
优点:
可以快速捕捉大量数据较为真实缺点:
复杂、昂贵动作常常会不满足要去,需要后期调整捕捉条件限制捕捉方法:
光学磁力机械动画的制作流程:
刚体模拟刚体不会发生形变,通过求得下面的参数通过上面粒子模拟的方法计算出任意时刻的位置
流体模拟定义水体是由多个刚体小球形成的,不可压缩模拟与渲染是分开的过程实现思路通过获取任意时刻小球的分布位置来获取小球单位面积的密度如果密度如果发生改变(不同于平静的水面),就通过通过改变小球的位置来修正位置,让水总有一个趋于平静的趋势通过加入能量损失让水最终停下来质点法和网格法质点法和网格法流体模拟中的两个不同的思路
质点法(拉格朗日法):逐个模拟每个粒子
网格法(欧拉方法):将一个空间定义为一个网格,通过观察以网格为单位的时间如何变换来模拟
混合方法MPM质点:将不同的粒子的不同属性储存在粒子上网格:模拟变换的过程在网格中完成将每一个时刻网格的信息写回网格内的粒子上