渲染管线(Rendering Pipeline)
顶点处理Vertex Processing 顶点流Vertex Stream
三角形的处理Triangle Processing 三角形流Triangle Stream
光栅化Rasterization 碎片流Fragment Stream
分段处理Fragment Processing 阴影片段Shaded Fragments
Framebuffer操作Framebuffer Operation
显示Display
MVP变换
模型变换(Model Transformation)
二维基础变换操作
缩放
非均匀缩放
镜像
切变
旋转
线性变换
其次坐标
三维空间变换
视角变换(View/Camera Transformation)
视角变换矩阵
投影变换(Projection Transformation)
-正交投影(Orthographic Projection)
理论理解:
-相机在原点,向上方向为Y,看向-Z
-丢弃Z坐标
-通过平移和缩放,将物体放在[-1,1]^2矩形内
步骤:
-平移立方体(中心平移至原点) -缩放立方体
-透视投影(Perspective Projection)
视口变换(Viewport Transformation)
什么是屏幕?
屏幕是由一系列的像素所组成的典型的光栅成像设备
什么是像素?
像素是颜色(red, green, blue)的混合均匀的小方块
光栅化
-光栅化一个三角形(Rasterization)
三角形独一无二的性质:
-三角形一定是平面的
-容易区分内外
-有明确的插值方法
采样(Sampling)
对函数离散化(Discretization)的过程,对时间(1D)、区域(2D)、方向(2D) 体积(3D)等等采样
锯齿出现的原因是因为我们的采样频率不够高
-采样理论(Sampling Theory)
-频域中采样与走样的理解
走样的本质——信号变化太快,但采样太慢
瑕疵:锯齿、摩尔纹(不同位置)、车轮效应(时间)
为什么采样速度跟不上信息变化速度就会走样?
采样在频域的表现上,就是重复频域内容,走样则是频域的内容发生了重叠
为什么先采样后模糊达不到想要的效果?
并不能实现抗锯齿的效果
-频域与傅里叶变换(Frequency Domain and Fourier Transforms)
空域(Spatial Domain):
即像素域,在空域的处理就是像素级的处理。 通过傅里叶变换,可得到图像的频谱。
时域(Time Domain):
描述数学函数或物理信号对时间的关系。 视频可以认为是时域上的图像序列构成。 图片可以认为是时域上的单幅图像。
频域(Frequency Domain):
描述信号在频率方面特性时使用的一种坐标系。
频域中的任何波都可以由正弦波的组合完全且唯一地描述。频域就是空域经过傅里叶变换的信号。
傅里叶变换是实现从空域或时域到频域的转换工具。
滤波 从频域的角度说,就是把特定的频率抹掉。
走样:不同频率信号在给定采样率下无法区分的现象
位置:
图片中心表示最低频区域
图片周围表示最高频区域
从中心到周围频率越来越高
亮度:
越亮表示所代表频率信息越多
越暗表示所代表频率信息越少
-卷积定理(Convolution Theorem)
卷积核(Box Filter)的作用就是将图像上某像素点作为中心点,求它及其周围像素的平均值,再将结果赋予该像素点
卷积运算
方法1:直接利用卷积核在空域中进行卷积运算
方法2:
• 先将图像通过傅里叶变换转换到频域
• 再将卷积核通过傅里叶变换转换到频域,并将两个频谱相乘
• 最后将得到的结果通过傅里叶变换转换到空域
傅里叶变换是频域分析领域中的重要工具
卷积是泛函分析领域中的重要运算
卷积与傅里叶变换有着密切的关系——卷积定理
卷积定理是傅里叶变换的重要性质之一
空域中的卷积操作相当于频域中的乘积操作
减少走样方法:
提高采样率:问题是没有钞能力
反走样:
先模糊 ——拿掉高频信息(低通滤波),再采样
-反走样(Antialiasing)
-多重采样反走样(Antialiasing by Multisampling)
MSAA
将一个像素划分为 4*4个小像素,每一个小像素都有一个像素中心,然后可以对这个小像素进行采样,判断这些小像素在不在三角形内,然后将最后的结果平均起来,就能够求的三角形对一个像素的区域的近似的覆盖模糊值
提高了计算的成本
-可视性/遮挡(Visibility/Occlusion)
画家算法(Painter’s Algorithm):从远景开始画,然后逐渐画近景覆盖远景
问题:无法对下面三角形排序
-深度缓冲 Z-Buffer算法(Z-Buffer Algorithm)
对于每一个像素,保存当前最小的|z|值作为该像素所绘制的物体的深度
需要一个额外的Buffer来记录每一个像素的当前深度值|z|
• 帧缓冲(frame buffer)存储像素的颜色的值(color values)
• 深度缓冲(z-buffer)存储像素的深度值(depth)
着色
布林冯模型(Blinn-Phong Reflectance Model)
输入:
观测方向v、法向量n、光照方向l、着色点表面参数(颜色,材质,反光度等)
-漫反射(Diffuse Reflection)
投射在物体表面上的光均匀地向各个方向反射的现象
漫反射与观测方向无关
光衰减:I=I/r^2
朗伯余弦定理(Lambert’s Cosine Law):若物体表面与光源方向夹角不同,物体表面的明暗程度不一样
漫反射强度计算:
-高光(Specular Highlights)
与观测方向v相关,观测方向与光的镜面反射方向越近,高光效果越强
增加指数p来缩小反射波瓣(reflection lobe)
-环境光(Ambient Lighting)
环境光不用考虑光的方向,与观察的方向也无关
布林冯模型最终效果
-着色频率(Shading Frequencies)
纹理映射(Texture Mapping)
-重心坐标(Barycentric Coordinates)
应用:位置、纹理坐标、颜色、法向量、材料性质、深度
-纹理查询(Texture Queries)
双线性插值Bilinear Interpolation
问题:纹理太大
Mipmap / Ripmap
Mipmap
快速的,近似的查询一个正方形范围内的平均值
基本思想:范围查询(Range Query)代替点查询(Point Query)以快速查找“Footprint”在纹理中的对应值
三线性插值
问题:过度模糊
Ripmap
各向异性过滤(Anisotropic Filtering)
各向异性过滤会对把原纹理图缩放成不同大小的矩形,其生成的一系列纹理图叫做Ripmap
-纹理应用(Applications of Textures)
环境映射:环境光、球环境地图、墨卡托投影(Mercator Projection)、立方体贴图(Cube Map)
纹理=内存+范围
几何
-表示方法(Representation Method)
• 显示表示(Explicit Representation) y=f(x):多边形面、点云
• 隐式表示(Implicit Representation) f(x,y)= ax+by+c = x^2 + y^2 -r^2 = 0:CSG、符号距离函数、水平集、分型
• 参数形式(Parametric Form)x=x(t) y=y(t) (0<=t<=1)
-贝塞尔曲线(Bezier Curve)
用一些控制点来控制曲线. 以p0p1,p2p3为切线的曲线
de Casteljau算法:
基本思路:假设有一个时间t属于[0,1],只要找出在任意时间t上所对应的曲线的点,就可以画出整条曲线
贝塞尔曲线代数形式
n阶贝塞尔曲线的伯恩斯坦形式
性质:
仿射变换性质:原始曲线的贝塞尔曲线进行仿射 = 原始曲线的仿射变换曲线的贝塞尔曲线
凸包性质:画出的贝尔塞曲线一定在凸包内
分段贝塞尔曲线
连续性
C0连续(连在一起):an=b0
C1连续(切线连续):an=b0=(an-1 + b1)/2
基本思路:将多个低阶贝塞尔曲线连接起来,通常为三次贝塞尔曲线
贝塞尔曲面:
通过对控制点构建贝塞尔曲线,再对贝塞尔曲线上的点求贝塞尔曲线,横竖求解后,即可得到一个平面
贝塞尔曲线不足:
-给定(n+1)个控制点,就决定曲线代数形式 = 的阶次为n次
-贝塞尔曲线不能做局部修改
-B样条曲线(B-spline Curve)及分类
样条:一条由一系列控制点控制且具备一定连续性质的曲线
B样条:基函数样条:基函数通过某些方式组合在一起,构造更加复杂的函数
贝塞尔曲线是B样条的特例,B样条是贝塞尔曲线的扩展
Ti,Ti+k
T0,…,Tn+k
分类:
均匀B样条:基函数呈周期性
准均匀B样条:两端节点具有重复度k
分段贝塞尔曲线:各曲线段具有相对的独立性,且直接采用简单的de Casteljau算法
非均匀B样条:节点均匀等距离分布(ti+1 - ti != 常数)
-三次样条曲线(Cubic Spline)
满足三次函数的曲线
-网格操作(Mesh Operation)
网络细分
Loop细分:1三角形->4三角形
Catmull-Clark细分:1四边形->2三角形->切半
网络简化:减少网格数量的同时保持整体形状
边坍缩:捏顶点少一边
二次误差:到各点距离平方和最小
基本思路:选择能够最小化二次误差的边进行坍缩
数据结构:优先队列、堆
步骤:
1.赋值边,值为假设坍缩这条边,新顶点的最小二次误差
2.选择最小二次误差最小的边做坍塌,更新顶点
3.更新与新顶点相连边赋值
4.重复
光线追踪
Why:光栅化渲染不太能够处理全局效果、光栅化渲染速度快,但是质量相对较低
光线追踪结果准确,但速度慢
-光线与物体相交(Ray-object Intersections)
隐式表示表面
光线公式
光线与球面的交点
求t
三角形网格
MT算法
三维向量、三个未知数 重心坐标和光线向量
-光线与AABB相交(Ray-AABB intersections)
包围盒:把物体包围光线与包围盒都不交,那肯定不交
轴对齐包围盒(AABB):三对相互垂直的无限大平面形成的交集
核心思想:
-当光线进入所有方向上的对面时,光线进入了包围盒
-当光线离开任一方向上的对面时,光线离开了包围盒
texit<0 包围盒在光源背后
texit >= 0 and tenter < 0 光源在包围盒内部
光线与AABB相交当且仅当 tenter < texit(光线有一段时间在盒子内部) && texit >=0
-光线追踪加速(Accelerate Ray Tracing by AABBs)
空间划分:
均匀格 场景预处理
1)找到包围整个场景的包围盒
2)将包围盒分为均匀的格子
3)判定与物体表面相交的格子
稀疏:加速效果不明显
密集:加速效率低
KD-tree
KD-tree的缺陷:
同一个物体被多个叶子节点存储,浪费了空间
三角形网格与包围盒的相交判断很复杂
物体划分:
BVH
选择包围盒最长的维度划分
选择中间的物体作为划分点,保证每个部分物体数量相当,则生成的树更加平衡,深度更小
终止:当结点包含的物体数量小于固定数量
-辐射度量学(Radiometry)
Radiant Flux
辐射通量:单位时间内光源辐射出来的能量
单位是焦耳,通常用符号Q表示
Radiant Intensity
辐射强度 :单位时间内,光源向单位立体角所辐射出来的能量
Irradiance
辐照度:单位时间内,每个单位面积上接收到的光照的能量(与光线垂直)
Radiance
辐射亮度:描述环境中光的分布的基本场量
某个方向辐射能量+某个表面
Irradiance vs. Radiance
-BRDF与渲染方程(Rendering Equation)
BRDF双向反射分布函数
用来定义着色点接收给定入射方向来的Irradiance如何分配给定出射方向上的Radiance
描述了光线与物体如何作用,也就表示物体的材质
反射方程:
考虑物体发光:
Rendering Equation渲染方程
=自己产生的光+反射别人来的光
简写:
直接看到光源+光源辐射反射一次+反射两次+三次+…
-路径追踪(Path Tracing)及其与Whitted-style光线追踪的比较
蒙特卡罗积分法 (Monte Carlo Integration):解定积分
样本越多,方差越小
在x上采样,则在x上积分
求解渲染方程:1)求解定积分 2)递归计算
球面面积4pai,半球2pai
问题1:递归:当光线弹跳次数增多时,光线数量会爆炸
假设在每个着色点只有1条光线被追踪(N=1),算法结果噪声肯定非常大
解决思路:针对每个像素,追踪多条路径,然后求radiance 的平均值
Ray Generation(光线生成)算法
问题2:递归算法何时停止?
解决方法:Russian Roulette(RR)(俄罗斯轮盘赌)
人为设置一个概率P(0<P<1)
-以一定的概率P,引一条光线,计算着色结果并返回 Lo/p
-以一定的概率(1 - P),不引光线,返回着色结果 0
E = P * (Lo / P) + (1 - P) * 0 = Lo (巧妙之处还能期望,可能有噪音但是最后结果对)
算法
问题:
效率不高
原因:
若光源面积小,采样产生的路径大概率不会打到光源,但光源确实有能量传播至着色点
解决:
采样光源
渲染方程改成在光源上的积分
重新修改渲染方程算法,考虑radiance有两种来源
1)光源(直接光照,且不需要轮盘赌)
2)其他物体反射(间接光照,需要轮盘赌)
3)光源被遮挡
-材质(Material)
漫反射材质
抛光金属
玻璃、水
斯涅尔定律
折射定律
若折射不发生
菲涅尔项
多少反射(垂直),多少折射(平行)
与n1n2和入射角西塔有关
微表面模型Microfacet BRDF
物体表面粗糙,但是从远处看近似于平的。
从远处看看到的是材质,从近处看看到的是几何。
每一个微表面在近处看为镜面反射。
第一个F是菲涅尔项,决定多少能量被反射(垂直时候被反射的能量多,反之少)
第二个G是几何项,计算微表面上的相互遮挡(在grazing angle平着照射微表面的时候容易出现互相遮挡)
第三个D是法线分布,当微表面的法线方向与给定的出入射角的半程向量一定才证明这个微表面的入射方向出射方向正确
各向同性/各向异性
区别:微表面的方向性不一样
各向异性:BRDF与绝对方位角有关
BRDF性质
非负性(Non-negativity)
线性(Linearity)
可逆性(Reciprocity Principle)
能量守恒(Energy Conservation)
-颜色(Color)
同色异谱现象
色彩匹配
加色系统(Additive Color):匹配任何颜色
给定一套原色(e.g. R, G, B),每个原色有其自身的谱功率密度
匹配不了?给他加一个颜色再去匹配,匹配好了减掉:RGB色彩匹配系统
各种表色系统
XYZ表色系统
在RGB系统的基础上,用数学方法,选用三个理想的原色来代替实际的三原色,从而将CIE-RGB系统中的光谱三色刺激值均变为正值
三维->二维可视化:
归一化:固定Y(亮度),可视化XZ
越纯的颜色越靠近边缘
越不纯的颜色越靠近中心
色域
不同色域颜色不同
HSV颜色模型
根据颜色的直观特性由 A. R. Smith在1978年创建的一种颜色空间
色调(Hue)不同类型颜色
饱和度(Saturation)接近白还是接近纯色
明度(Value)接近黑还是接近纯色
CIE LAB系统
将所有的颜色用L、a、b 3 个值表示,并用三维坐标来定义
Lab空间:L亮度(黑白),a(红绿),b(蓝黄) --互补色
CMYK减色系统
混合的越多,颜色越黑
存在K:成本问题
动画
-实现动画的各种方法的基本思想与优劣势
• 关键帧动画(Keyframe Animation)
关键帧插值:线性插值、样条插值
线性插值结果一般不够好
样条插值更加地平滑且可控
• 物理模拟(Physical Simulation)
- 质点弹簧系统(Mass Spring System)
胡克定律(Hooke’s Law)
运动阻尼(Motion Damping):与长度无关
- 粒子系统(Particle System)
每一帧:(产生新粒子)、计算粒子力、更新粒子位置速度、(删除死亡粒子)、渲染粒子
粒子:吸引力排斥力、阻尼力、碰撞
模拟鸟群:吸引力、排斥力、对齐
• 正向运动学(Forward Kinematics)
可定义骨架系统(Articulated Skeleton)
• 拓扑结构(什么与什么相连)
• 关节之间的几何联系
关节类型:
• Pin(1D rotation)
• Ball(2D rotation)
• Prismatic joint(translation)
优势:
非常方便直接控制
实现非常容易
劣势:
不方便描述
对于艺术家来说很耗时
• 逆向运动学(Inverse Kinematics)
为什么复杂?
• 可能存在多个解
• 可能没有解
实际求解方法——机器学习
• Rigging(绑定)
利用高阶的控制方式控制物体的行动
Rigging难做:
• 需要很多人力
• 要求工作人员既有美感,又了解技术
• 动作捕捉(Motion Capture)
是一种数据驱动方法,根据随时间变化的数据提炼出不同的动作
优势:
• 更加贴近真实
• 能够快速捕捉大量现实数据
劣势:
• 复杂且昂贵的设备
• 捕捉的动作不一定符合艺术追求
-欧拉方法及其改进(Euler Method and Improvement)
欧拉方法
时间离散化
Like:X=x+vt、V=v+at
不够准确,且不稳定
误差:每个时间步长都会产生误差,且误差会随着步长增多而累积
不稳定性:任何模拟仿真方法所得结果都会与真实结果偏离,且偏离会越来越远
中点法
思想:平均一个步长起点与终点的速度
自适应欧拉方法
隐式欧拉方法
思想:利用下一个时刻的速度,计算下一个时刻的位置
稳定性比较好
稳定性:
使用“局部截断误差-(every step)”与“累积误差- (total)”来衡量稳定性
误差的阶阶数越大越好