完备函数空间
万能逼近定理:多项式函数空间是稠密的
对上的任意连续函数,及任意给定的,必存在次代数多项式,使得
最小二乘拟合
选择一个变换函数空间
线性函数空间
函数表达为系数参数:
最小二乘拟合:极小化数据误差
径向基函数
Radial basis function:
给定个锚点,
Lagrange插值函数
插值个点、次数不超过的多项式是存在而且是唯一的——(个变量,个方程)
插值函数的自由度 = 未知量个数 - 已知量个数
避免过拟合的常用方法
数据去噪
数据增广
模型简化
正则约束
岭回归正则项
选择一个函数空间
最小二乘拟合
岭回归
稀疏学习:稀疏正则化
冗余基函数(过完备)
通过优化来选择合适的基函数
稀疏学习的不同形式
稀疏表达
字典学习
稀疏正则化
压缩感知
已知和,有无穷多组解
对于稀疏信号,可通过优化能完全重建
在一定条件下
PDE
二阶线性PDE
泊松方程
边界条件
Dirichlet boundary conditions:
Neumann boundary conditions:
离散泊松方程
离散线性系统形式:
解方程算法:
直接解
迭代解
Multigrid method
变分插值
利用欧拉方程:
可得
点在曲线的处
曲线处的切线
曲线处的法向量和副法向量
曲线处的曲率和曲率半径
曲线处的曲率是沿的分量
曲线曲率的计算
对于参数方程曲线,
切向量
单位切向量
曲率
曲面上处的一点
在方向上的切向量
在方向上的切向量
切平面
曲面第一基本形式
法向量
法截面
曲率
曲率半径
曲面第二基本形式
张量计算
取曲面的切平面
构造正交基
第一基本形式
用和表示点
曲率
是关于方向的函数
的特征分析
特征值:
特征向量:
的特征分解
Weingarten Operator
其中,,
又
若
否则选择正交向量
Bending Energy
连续二次型逼近
二次型逼近函数:
最小二乘拟合:
写成矩阵形式:
最小二乘解:
该二次型曲面下的曲率和为以下方程的实根:
离散逼近
平均曲率:
高斯曲率
不同的坐标系
变换:左乘规则
变换合成问题举例
问:相对的坐标是多少?
答:
设的标架为(世界坐标架)
设变换矩阵,或
作变换:
坐标系
基本几何要素
几何研究维空间中对象之间的关系
需要三个几何要素
标量
向量
物理定义:向量是具有以下两条性质的量
向量运算
每个向量都有逆
每个向量都可以与标量相乘
有一个零向量
两个向量和为向量
线性空间
运算
向量没有位置
点
空间中的位置
点与向量之间可进行的运算
仿射空间
点加上向量构造的空间
运算:
对于任意点,定义
向量的线性组合
给定个向量以及个标量,则有
点的线性组合
给定个点以及个标量,线性组合:
固定坐标系,取定其中两点,则对于,有
由归纳法,从“点-点=向量”和“标量·向量=向量”可知:
当组合系数和时,点的线性组合为点,称为给定点的仿射组合
直线
具有以下形式的所有点:
(参数形式)
即所有过点,与连线平行于向量的点
二维形式
显式:
隐式:
参数形式
射线和线段
如果限定,则就是从出发,方向为的射线
如果采用两点定义向量,则
当,那么就会得到连接与两点的线段
两点的线性插值
给定两点,,那么它们的仿射组合
定义了过这两点的一条直线
应用
关键帧动画
多边形的变形
给定两个有同样数目顶点的折线,那么利用线性插值可以给出从第一个折线到第二个折线的光滑过渡
凸体
仿射凸组合
考虑“和”式
当时上述和式有意义,此时结果就称为点的仿射和
若,那么得到的凸包
凸包
最小的包含的凸体
可用“收缩包装”的方式得到
曲线与曲面
曲线是形式为的单参数定义的几何体,其中的函数为非线性
曲面是由形式为的两个参数定义的几何体
平面
平面由一个点与两个向量或者三个点确定
三角形
向量的内外积
内积:,为两个向量的夹角
外积:为向量,其长度等于,方向垂直于,所在平面,并且保证,,成为右手系,其中0为两个向量的夹角
法向量
每个平面都有一个垂直于自身的向量
在平面的点与二向量形式中,可以应用向量的外积得到
线性空间
一组向量称为线性无关的,是指
当且仅当
如果一组向量是线性无关的,那么不能把其中一个向量表示成其它向量的线性组合
如果一组向量是线性相关的,那么其中至少有一个向量可以表示为其它向量的线性组合
维数
在维空间中,任意个线性无关的向量构成空间的基
给定空间的一组基,空间中任意向量都可以表示为
其中是唯一的
坐标系
考虑维向量空间的基
一个向量可以表示为
标量组就称为相对于给定基的表示
可以把表示写成列向量
标架
在标架中的表示
标架由确定
在这个标架中,每个向量可以表示为
每个点可以表示为
统一的表示:
如果定义,,那么
从而得到维齐次坐标表示
齐次坐标
四维齐次坐标的一般形式为
可以通过下述方法给出三维点(当)
当时,表示对应的是一个向量
注意:齐次坐标表示中把四维空间中过原点的一条直线对应于三维空间中的一个点
齐次坐标在图形学中的应用
变换坐标系
考虑同一个向量相对于两个不同基的表示。假设表示分别是
其中
,,中每个向量都可以用第一组表示出来
所有系数定义了一个3X3矩阵
两组基可以如下联系在一起:
改变标架
考虑标架
任何点和向量都可以用它们中的一个表示出来
把基的改变方法进行推广:
定义了4X4阶矩阵
表示的变换
两个标架中任意点和向量具有同样形式的表示
在第一个标架中:
在第二个标架中:
其中当表示的是点时,,表示的是向量时,并且
这里矩阵是4X4阶,用齐次坐标定义一个仿射变换
仿射变换
世界标架与摄像机标架
摄像机的移动
一般变换
所谓变换就是把点映射到其他点,把向量映射到其他向量
连续变换
仿射变换
保持共线性
许多物理上重要变换的特征
变换的应用
组合、构造场景
摄像机视角位置变换
计算机动画
流水线实现
记号
:仿射空间中的点
:仿射空间中的向量
:标量
:点的表示
:向量的表示
平移
把一个点移到新的位置
平移由一个向量确定
对象的平移
把一个对象上的所有点沿同一向量平移
平移的表示
应用在某个标架中的齐次坐标表示
那么或
平移矩阵:可以用在齐次坐标中一个4X4的矩阵表示平移:,其中
二维旋转
考虑绕原点旋转角
三维旋转
几种特殊情形
绕轴的旋转
在三维空间中绕轴旋转,点的坐标不变
旋转矩阵
绕轴和绕轴的旋转
放缩
沿每个坐标轴伸展或收缩(原点为不动点)
其中,
放缩因子:
反射:
对应于负的放缩因子
逆变换
虽然可以直接计算变换矩阵的逆,当根据几何意义可以给出各种变换的逆
平移:
旋转:
对任一旋转矩阵成立
注意到,,从而
放缩:
变换的复合
可以通过把旋转、平移与放缩矩阵相乘从而形成任意的仿射变换
因为对许多顶点应用同样的变换,所以构造矩阵的代价相比于对许多顶点计算的代价是很小的
难点在于如何根据应用程序的要求构造出满足要求的变换矩阵
变换的顺序
注意在右边的矩阵是首先被应用的矩阵
从数学角度来说,下述表示等价
变换的顺序是不可交换的
绕原点的一般旋转
绕过原点任一轴旋转角可以分解为绕轴旋转的复合:
称为Euler角。注意旋转顺序不可交换,可以用不同的旋转顺序,不同的旋转角度得到同样的效果
绕不同于原点的固定点旋转
把固定点移到原点
旋转
把固定点移回到原来的位置
错切
错切矩阵
考虑沿轴的错切
矩阵形式:
一个二维旋转相对于三个错切变换的复合
四元数
把虚数从二维推广到三维
需要一个实部和三个虚部
运算性质:
点:
四元数与旋转:
四元数可以表示在球面上的光滑旋转,而且非常有效
处理过程:
OpenGL中的矩阵
在OpenGL中矩阵是状态的一部分
有三种类型
用于操作的单组函数
选择所操作的对象
glMatrixMode(GL_MODELVIEW)
glMatrixMode(GL_PROJECTION)
当前变换矩阵(CTM)
CTM运算
CTM可以被改变,改变的方法是上载一个新得CTM或者右乘一个矩阵:
上载单位阵:
上载任意矩阵:
上载一个平移矩阵:
上载一个旋转矩阵:
上载一个放缩矩阵:
右乘任意矩阵:
右乘一个平移矩阵:
右乘一个旋转矩阵:
右乘一个放缩矩阵:
绕固定点的旋转
其中每个运算对应于程序中的一个函数调用
在OpenGL中的CTM
旋转、平移、放缩
上载单位阵
xxxxxxxxxx
glLoadIdentity();
在右边相乘
xxxxxxxxxx
glRotatef(theta,vx,vy,vz);
// theta以角度为单位,(vx,vy,vz)定义旋转轴
glTranslatef(dx,dy,dz);
glScalef(sx,sy,sz);
每个函数的参数还可以是d(double)类型
任意矩阵
可以上载应用程序中定义的矩阵,或者使之与CTM相乘
xxxxxxxxxx
glLoadMatrixf(m);
glMultMatrixf(m);
矩阵m是有16个元素的一维数组,其按列定义了4X4矩阵
在glMultMatrixf(m)
中m乘在已有矩阵的右边
矩阵堆栈
许多情况中需要保存变换矩阵,待稍后再用
OpenGL为每种类型的矩阵维持一个堆栈
应用下述函数处理矩阵堆栈
xxxxxxxxxx
glPushMatrix();
glPopMatrix();
读入后台矩阵
OpenGL状态中有些信息是以矩阵形式保存的
可以利用查询函数读入矩阵
xxxxxxxxxx
glGetIntegerv
glGetFloatv
glGetBooleanv
glGetDoublev
简介
视图中需要三个基本要素
经典视图就是基于这些要素之间的关系的
每个对象都假定是用平面的基本多边形构造出来的
平面几何投影
即投影到平面上的标准投影
投影线为直线,这些直线满足:
这种投影保持共线性
分类
经典投影
基准面
在诸如建筑业等实际应用中,所观察的对象通常由许多平坦面构成
这些面中任一个都可以认为是一个基准面,从而进行定位
透视投影
正交投影
多视点正交投影
优势
保持形状
可以用来测量
不足
轴测投影
投影面相对于对象基准面有一定的夹角
根据对立方体进行投影时一个角点处有多少个角进行分类
没有:三度
两个:四边
三个:等角
优势与不足
直线段长度被缩短(foreshortened),但可以求出收缩因子
保持直线但不保角
可以见到盒子类对象的三个基准面
会导致某些观察错觉
倾斜投影
投影线与投影面之间的关系任意
优势与不足
可以增加某个角度,以便强调特定面
在平行于投影面的面上的角是保持的,但我们仍然可以见到其他侧面
在实际世界中,只能利用特殊相机做到这一点
透视投影
投影线汇聚于投影中心(COP)
灭点
实例
三点透视
两点透视
单点透视
优势与不足
同样大小的对象,离视点越远,投影结果就越小
在一条直线等距的几点投影后不一定等距(非均匀收缩)
只有在平行于投影面的平面上角度被保持
相对于平行投影而言,更难用手工进行绘制(对计算机而言没有增加更多的困难)
简介
视图有三个功能,都在流水线体系中实现
定位摄像机
设置镜头
裁剪
合成照相机
计算机视图是基于合成照相机的,原则上可以实现所有的经典视图
所有的经典视图是基于对象、观察者和投影线之间的紧密联系的,而在计算机图形学中强调的则是对象定义与照相机定义之间的独立性
在OpenGL中可以指定采用的是透视投影或者正交投影,但在透视投影中OpenGL并不知道什么是单点、两点或三点透视
OpenGL中的照相机
在OpenGL中,初始的世界标架和照相机标架相同
照相机位于原点,并指向z轴的负向
OpenGL也指定了默认的视景体,它是一个中心在原点的边长为2的立方体
缺省投影
定义可见的对象
在缺省的照相机设置下,为了使定义的对象可见,只要使对象的位置和尺寸与默认视景体相匹配
移动照相机标架
如果想看到具有更大的正z坐标的对象,我们可以
把照相机沿z轴正向移动
把对象沿z轴负向移动
二者是完全等价的,都是由模型—视图矩阵确定的
glTranslated(0.0,0.0,-d)
d>0
照相机参数
照相机的默认位置在原点,指向轴负向
所期望的位置称为视图参考点(view-reference point, VRP)
照相机定向
VPN vs. VUP
VPN给出投影面的方向,即平面的法向
只有平面的定向不能完全确定照相机的定向
只有给出了VUP,才完全确定了照相机的方向
VUP
不必要去VUP向量必定平行于投影面
把VUP投影到投影平面上得到上方向量
视图定位矩阵
设VRP点,视平面法向,上方向量为
,把,单位化
视图定位矩阵为
飞机操纵模拟
星空观察
采用极坐标
点在天空中的位置指定
投影与规范化
在视点(照相机)标架中默认的投影是正交投影
对于在默认视景体内的点,,,
大多数图形系统应用视图规范化的过程
齐次坐标表示
默认的正交投影矩阵:
简单透视
透视方程
考虑顶部与侧边视图
齐次坐标形式
透视除法
如果,那么必须从齐次坐标中除以而得到所表示的点
透视方程
透视变换
透视除法是非线性的,导致非均匀缩短
透视变换是保直线的,但不是仿射变换
透视变换是不可逆的,因为沿一条投影直线上的所有点投影后的结果相同
投影流水线
视角
视景体
若胶卷是矩形的,那么由视角张成一个半无穷的棱台,这称为视景体
OpenGL的正交视图
OpenGL的透视
视野的应用
glFrustum
有时很难得到所期望的结果gluPerspective(fovy,aspect,near,far)
可以提供更好的界面流水线
在模型-视图变换和投影变换的过程中,一直在四维齐次坐标系中操作
规范化使得不管投影的类型是什么,都是相对于默认的简单立方体进行裁剪
投影直到最后时刻才进行
正交规范化
规范化求出把指定裁剪体转化为默认裁剪体的变换
xxxxxxxxxx
glOrtho(left, right, bottom, top, near, far)
正交规范化矩阵:
把中心移到原点,对应的变换为
进行放缩从而使视景体的边长为2
最后的投影
令
这等价于如下的齐次坐标变换
从而在4D中一般的正交投影为
倾斜投影
OpenGL的投影函数不支持一般的平行投影,例如立方体的如下图示
此时立方体好像发生了错切,然后再进行正交投影
倾斜投影 = 错切+正交投影
一般的错切
错切矩阵
投影矩阵:
一般情形:
等价性
对裁剪体的影响
投影矩阵把原来的裁剪体变换为默认的裁剪体
简单透视
透视矩阵:
该矩阵与远裁剪面无关
推广
在透视除法后,点变到了
无论,的值是什么,在正交投影后就得到所期望的点,此时矩阵非奇异
与的选取
若取
那么近平面映射到
远平面映射到
各侧边映射到
规范变换
隐藏面消除
OpenGL的透视
glFrustum
可以定义非对称视景体,但gluPerspective
不能做到这一点
OpenGL透视矩阵
在glFrustum
中的规范化需要进行一个初始剪切变换,从而形成一个视景棱台,接着进行放缩变换,得到规范后的透视视景体。最后,透视矩阵导致只需要最后的正交变换:
意义
像素构成的矩阵:连续空间的离散采样
DDA算法(数字微分分析法)
直线满足微分方程
沿扫描线
xxxxxxxxxx
for(x=x1;x<=x2;x++)
{
y+=m;
write_pixel(x,round(y));
}
Bresenham算法
DDA算法中每一步需要一次浮点加法
在Bresenham算法中可以不出现任何浮点运算
只考虑的情形
假设像素中心在半整数处
如果从一个已被确定激活的像素出发,那么下一像素的可能位置只会有两种可能
增量形式:
如果基于第步的决策变量表示第步的决策变量,可以使算法更有效:
对每个值,只需要进行整数加法以及测试
可以在图形芯片上用单个指令实现
内外检测:奇偶检测法
从一点引射线,如果与多边形边界交点数为偶数,则在多边形外,否则在多边形内部
扫描线转化算法
通过维持一个特别的数据结构(结构中保存扫描线与多边形的交点)进行填充
数据结构:
中点法:Bresenham算法
正负判定法
锯齿现象
走样现象的缓解
概述
对给定点集合
重心坐标表示为:
其中,对所有
各种重心坐标的计算方法
Properties:
DT maximizes the smallest angle
Convex hull: union of all triangles
DT maximizes the arithmetic mean of the radius of inscribed circles of the triangles.
DT minimizes roughness (the Dirichlet energy of any piecewise-linear scalar function)
DT minimizes the maximum containing radius (the radius of the smallest sphere containing the simplex)
The DT in d-dimensional spaces is the projection of the points of convex hull onto a (d+1)-dimensional paraboloid.
DT minimizes the spectrum of the geometric Laplacian (spectral characterization)
Start with any triangulation
Definition: The VT is a centroidal Voronoi tessellation (CVT) , if each seed coincides with the centroid of its Voronoi cell
CVT energy function:
The Gradient of CVT Energy
The gradient of :
其中,
Lloyd Algorithm
ODT energy function
Compare ODT and CVT
对于简单多面体
V:顶点数,F:面数,E:边数
如果多面体不是简单的,在面上有H个洞,通过多面体的洞有个,那么
Topology
Orientability
Developablility
OBJ文件格式
Vertices
Faces
Other properties
定义网格
Geometry
Connectivity
List of Edge
Vertex-Edge
Vertex-Face
Combined
Surface & material properties
Rendering properties
List of vertices
List of faces
Pros
Cons
Definition
View mesh as connected graph
Given n vertices build n*n matrix of adjacency information
Geometric info
Add faces
Example
Pros
Cons
Record for each face, edge and vertex:
Half-Edge Structure
Example
Pros
Cons
Example
Pros
Cons
权重的选择:
Uniform weight (geometry oblivious)
Cotangent weight (geometry aware)
Normalization
用矩阵形式表示微分坐标
其中,
对三个分量有
重建:
解稀疏线性方程组
若Laplacian矩阵非方阵,则
求解最小二乘解
从变分角度看
Laplacian近似
Gradient近似
定义:平均曲率处处为0的曲面
If G=<V,E> is a 3-connected planar graph (triangular mesh) then any barycentric embedding provides a valid parameterization
如果边界位于凸多边形上,则三角形一定不会发生翻转
不同的参数化定义域:
求解映射的方法:
连续方法
离散方法
混合方法
问题描述
输入
输出
希望拥有的特性
主要方法
Methods that construct triangle meshes directly — Explicit methods
Methods that construct volumetric implicit functions — Implicit methods(隐式构网法:构造一个4D隐函数,在点上的值为0;抽取0等值面为结果曲面)
Radial basis function reconstruction
Registration:将不同视角的点云统一到同一个坐标系中
Laplacian Smoothing
Discrete Mean Curvature Flow Filtering
简化策略:删除不重要的顶点/边/面
Deform the vertex coordinates directly
Deform the control points
Deform the embedded space
Free-form Deformation (FFD)
Embed the object into a domain that is more easily parametrized than the object.
Advantages:
Detail-Preserving Editing
Laplacian Editing
Poisson Mesh Editing
Linear Rotation-invariant Coordinates
Keep a local frame at each vertex
Prescribe changes to some selected frames
Reconstruction
Given two objects produce sequence of intermediate objects that gradually evolve from one object to the other
Interpolate object shapes
Interpolate object attributes
Terminologies:
子问题:
Correspondence problem
Path Problem
摄像机模型中,目标点坐标为
齐次坐标:
几何关系如下:
世界坐标和摄像头坐标的转换:
令
原式可表示为
其中,为相机参数(相机投影矩阵),称为固有参数(内参Intrinsic),称为外部参数(外参Extrinsic)
静态物体的3D重建
视觉方法(Stereo Vision)
Shape from X
Multi-view stereo/geometry (MVS)
Structure from motion (SfM)
SfM vs. SLAM
SLAM的主要流程:
激光测点(三角几何)方法
基于深度相机的3D重建
动态物体的3D重建
人体动态重建:离线算法、在线算法
3D动态重建的困难性:
数据量大
数据采集困难
数据结构复杂
硬件需求高
基本流程:
核心问题:形状表征(描述子、特征)
三维数据的信息
点坐标
几何量
微分量
拓扑量
映射度量
...
各种人工定义的3D形状特征
三维数据深度学习的三种方法
质点
已知:质点在初始时刻的位置
预测:质点在下一刻的位置
牛顿第二定律:
求解初值问题:
解耦为一阶微分方程:
时间离散积分
数值求解
显式欧拉法
隐式欧拉法
半隐式欧拉法
牛顿第二定律
显式欧拉法
隐式欧拉法
半隐式欧拉法
胡克定律:
弹力:
弹簧质点对
阻尼
合内力
弹性力学角度
伪代码
欧拉隐式方法:
原问题可转化为求解方程:
其中,
对于保守力可以写为,这里为势能
上述方程可以描述为以下优化问题的解:
如果用Newton-Raphson方法求解即为通常的欧拉隐式方法
数值解法:
胡克定律:
能量极小化求解:
对每根弹簧:
加入辅助变量:,满足
胡克定律改写为:
当时,上述优化问题取得等号
弹性势能:
时间积分:
其中,
优化:
,,为常量,不依赖于,
Local/global 优化方法
Local Step:由当前求
可以并行优化
Global Step:
其中矩阵为常量,且为正定矩阵,故优化可以进行预分解
运动方程:
:刚度矩阵,:阻尼
为初始位置,令
将弹簧质点系统中的弹力替换为质点间的约束
6个自由度:位移,朝向
质心
质点的坐标表示
位移
速度
其中为刚体角速度
动量
刚体总质量
角动量
其中,为刚体的转动惯量,为初始时刻的转动惯量
运动方程
其中,满足,,为外力矩
应力
应力张量
平衡方程
本构方程
塑性材料
变形梯度:
空间离散:有限单元
变形的分类:
通过分析物体任意两点之间距离的变化分析形变
设为参考构型中选取的坐标架
Green-Lagrange应变张量:
形变梯度,则
Cauchy应变张量:舍弃Green-Lagrange应变张量中二次项
Co-rotated:
其中,极分解
线性弹性模型
应力(广义胡克模型):
其中,为弹性张量(四阶张量),为应力,为应变
各向同性材料:
和为拉梅常数,与材料有关
对杨氏模量为,泊松比为的材料:
势能:
力的计算:
超弹性模型
形变函数:
形变梯度张量:
超弹性材料能量:
能量密度:
不同能量:
物体倾向于平行移动
Neo-Hooken模型:
其中,,,和为拉梅常数
对于杨氏模量为,泊松比为的材料:
离散计算
将模型离散为四面体单元,设形变函数为分片线性函数,且在每个四面体单元上是线性的,由形变梯度定义:
在一个四面体单元(顶点,,,)中:
由
令
则
总能量:,其中为四面体体积
力的计算:
欧拉隐式方法
求解的最小值
牛顿法求解方程
迭代步骤:
速度更新:
模拟的改进
流体
其中,为静水压力,为单位矩阵,为黏度系数,
Navier-Stokes方程
拉格朗日视角 vs 欧拉视角
主要阶段
几何阶段
光栅阶段
基本图元
2D
3D
逐顶点计算
图元装配
光栅化
片元操作
光栅操作
成像模型:
3D场景在虚拟相机下的投影
应用程序指定:
各种坐标系:
顶点处理:
流水线中大部分工作是把对象在一个坐标系中表示转化为另一坐标系中的表示:
坐标的每个变换相当于一次矩阵乘法
模型及视图变换:
投影变换:
裁剪:视景图裁剪(超出可视范围的几何元素需裁剪掉,不参加后面的计算)
裁剪:窗口裁剪
消隐:消除隐藏面
屏幕映射变换
光栅化
如果一个对象不被裁掉,那么在帧缓冲区中相应的像素就必须被赋予颜色
光栅化程序为每个对象生成一组片段
片段是“潜在的像素”
光栅化程序在对象上对顶点属性进行插值(重心坐标)
光照模型
局部光照模型
全局光照模型
局部光照模型
三个主要部分:
漫反射:
模拟粗糙的表面:光向各个方向均匀地反射
反射光的比例正比与入射光的竖直分量
镜面反射:
模拟在镜面反射方向附近的聚集光现象
高光系数:
镜面反射的Blinn-Phong修正计算
Blinn利用中分向量给出了一个近似算法,减少计算量、提高计算效率
是和的平分单位向量,即
用代替
环境光:
背景光:模拟多次反射后的效果的近似
环境光强为常值
光源与材质属性
三原色中每种分量单独处理
材质
多个光源
着色结果
顶点的着色
顶点的法向
片元的着色
由顶点处的信息插值得到
Flat Shading(Shade each triangle)
每个三角形中的像素的法向都一样(三角形的法向)
相当于:视点在无穷远,光源在无穷远
Gouraud Shading(Shade each vertex)
Phong Shading(Shader each pixel)
不同着色方法的比较:
更复杂的光照模型
说明
对于顶点的着色在几何处理流程中就做好了,顶点的颜色作为顶点的属性传入到片元处理流程中使用
片元处理流程还可使用其他顶点属性
常用的图形渲染API
固定(不可编程)渲染管线
可编程渲染管线
固定管线:固定的处理模式(如Phong光照模型),至多有些参数可调,不够灵活
可编程管线
OpenGL的发展
OpenGL 3.1
完全基于shader
取消立即模式
减少状态变量
非向后兼容
OpenGL ES
嵌入式系统
Version 1.0(简化的 OpenGL 2.1版本)
Version 2.0 (简化的 OpenGL 3.1)
WebGL
OpenGL 4.1 and 4.2
OpenGL
跨平台的开放式标准API
可硬件加速的3D渲染系统
专业图形应用、科研
适合图形学教学
Direct 3D
Windows平台的专利API
3D硬件接口
计算机游戏
非向下兼容
OpenGL核心库
Windows: OpenGL32.dll (WINDOWS\SYSTEM32)
大多数Unix/Linux系统:GL库 (libGL.a)
OpenGL实用库
OpenGL的一部分
利用OpenGL核心库提供一些功能,避免重复编写代码
与窗口系统的连接
GLUT
OpenGL实用工具库(OpenGL Utility Toolkit Library, GLUT)
提供所有窗口系统的共同功能
代码可以在平台间移植,但是GLUT缺乏一些现代GUI的控件和功能
GLFW
在Windows操作系统下,若要使用最新版本的OpenGL功能
目的:对于特殊的操作系统,使得调用OpenGL 扩展功能更简单
对于Windows代码来说,避免直接调用实体入口(entry points)
应用程序需要:增加 glew.h头文件,调用 glewInit()即可
OpenGL应用程序结构
OpenGL流水线架构
OpenGL的函数
图元函数(primitive)
属性函数(attribute)
变换函数(transformation)
输入函数(input) GLUT
控制函数(control) GLUT
查询函数(query)
OpenGL的状态机模型
OpenGL使用状态机模型
OpenGL 函数有两大类型
生成图元(图元函数,如glVertex)
改变状态
程序依赖
头文件
xxxxxxxxxx
库文件
\opengl32.lib glu32.lib glut32.lib
C:\windows\system32\opengl32.dll glu32.dll glut32.dll
数据类型
为了兼容性,OpenGL定义了各种数据类型(#define)
GLfloat
, GLint
, GLenum
, etc.OpenGL变量命名准则
OpenGL函数名称格式
OpenGL程序的一般结构
简单示例
xxxxxxxxxx
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2d(-0.5, -0.5);
glVertex2d(-0.5, 0.5);
glVertex2d(0.5, 0.5);
glVertex2d(0.5, -0.5);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutCreateWindow("简单示例");
glutDisplayFunc(mydisplay);
glutMainLoop();
}
OpenGL中的摄像机
变换与视图
在OpenGL中投影是利用投影矩阵乘法(变换)进行的
因为OpenGL是一个状态机,拥有模型视点(modelview )矩阵栈和投影(projection) 矩阵栈,因此须先设置矩阵模式
xxxxxxxxxx
glMatrixMode(GL_PROJECTION);
变换函数是累加在一起的,因此需要从单位阵开始,然后把它改变为一个投影矩阵以定义视景体
xxxxxxxxxx
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
视窗
glViewport(x,y,w,h)
OpenGL的基本几何形状
定义多边形的限制条件
OpenGL只能显示满足下述条件的多边形
用户自己确保上述条件满足
属性
属性是OpenGL中状态的一部分,确定对象的外观
多边形的模式
RGB颜色
颜色的每个分量在帧缓冲区中是分开存贮的
在缓冲区中通常每个分量占用8位字节
注意在函数glColor3f
中颜色值的变化范围是从0.0(无)到1.0(全部), 而在glColor3ub
中颜色值的变化范围是从0到255
由glColor
设置的颜色成为状态的一部分,后续构造过程将使用这一颜色,直至它被修改为止
颜色的光滑化过渡:
默认状态是光滑过渡
另外一种状态是平坦过渡
glShadeModel(GL_SMOOTH)
或glShadeModel(GL_FLAT)
Z缓冲隐藏面消除
该算法创建专门的缓冲区(称为z缓冲区),当几何体经过流水线各步骤时,存贮着该几何体的深度信息
启用该算法的要素
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
多边形网格模型
隐藏面消除
光滑明暗处理
在计算了每个顶点处的亮度后,应用线性插值计算出内部的亮度——称为Gouraud明暗处理算法
镜面光
阴影
纹理映射
光源的描述
光线从光源表面离开的方式有两种
在表面上任一点所发出的光可以用,两个方位角表示以及每个波长的强度确定
一般的光源是很难处理的,因为我们需要对于在光源面上的所有点进行光强积分
光源颜色:光亮度函数
点光源
由位置和颜色表示
理想的点光源向各个方向发射光
远光源即在无穷远处的光源,光线为平行线
点光源的亮度函数
在点接受的光亮度反比于光源与点的距离
在计算机图形学中大量应用点光源,是因为它易于使用
但不能很好地反映物理现实
聚光灯
具有一个比较的窄的照明范围,通常为圆锥形半无穷区域
光亮度在照明锥内具有一定的分布
强度函数通常定义为
无穷远光源
在光照计算中需要计算从光源到当前点的向量
如果光源在无穷远,该向量为常数
环境光
如果对象表面光滑,对象显得明亮;如果表面粗糙,那么就显得暗淡
表面有三种类型
镜面
理想反射:
法向由局部定向确定
入射角 = 反射角
三个向量, , 必须共面
镜面光模型:
模拟在镜面反射方向附近的聚集光现象
高光系数:
漫反射面
Lambertian曲面:
漫反射光强:
反射光的比例正比于入射光的竖直分量
透明面
折射光:
和分别表示两种物质的折射系数
令,则
在OpenGL中应用明暗处理的步骤
三种映射方法
映射技术是在输出流水线的最后阶段实现的
纹理映射框架
映射函数
考虑从纹理坐标到曲面上一点的映射
直观地看,应当需要三个函数
逆映射
映射的确定
考虑由参数方程定义的曲面
此时通常采用如下形式从纹理元素对应到曲面上的点
只要,上述映射是可逆的
圆柱映射
假设纹理坐标在单位正方形内变化,圆柱高,半径
那么圆柱的参数方程为
从纹理坐标到圆柱面上没有变形
适合于构造与无底的圆柱面拓朴同构的曲面上的纹理
球映射
球的参数方程
可用在环境映射中
立方体映射
两步映射
首先把纹理映射到一个简单的中间曲面上
从中间对象到实际对象的映射
原因:采样不足
图像金字塔
MipMap存储
MipMap层次计算:
应用纹理映射的三个步骤
指定纹理
给每个顶点赋纹理坐标
指定纹理参数
应用纹理框架
在纹理对象中指定纹理
设置纹理滤波函数
设置纹理函数
设置纹理的wrap模式
设置可省的透视校正提示
结合纹理对象
激活纹理映射功能
为每个顶点指定纹理坐标
多重纹理
基本想法:
两步策略:
假设场景中没有表面镜子的多边形,照相机放在镜子的中心,指向镜子的法向
把上述图像贴到镜子多边形上
存在的问题:
第一步中得到的图像并不是很正确
必须处理映射中的问题
有时我们会移动镜子,那么就需要多次投影
经典解决方法:
经典的方法是把场景投影到一个球上,球的中心就是COP
早期的环境映射中接着就利用经纬线把球面上的图像对应到矩形上
球面映射
OpenGL支持上述方法的变体,即球面映射
Cube Map
从中间曲面的映射
把六个图像组合成一个环境映射,然后如图构造映射
基本想法
法向
法向扰动方法
设曲面方程为
在一点的单位法向为
假设曲面在法向移位
则变化后的法向近似为
计算方法
曲面表示的偏导数计算
位移函数的偏导数计算
斜面效应
沿几何图形的边界应当显示出明显的边界效果
描述斜面(bevelling)的参数
阶段1:从光源渲染
生成深度图
阶段2:从摄像头渲染
比较:
渲染管线
逐片元操作
逐片元操作的应用
深度缓存
模板缓存
融混
多重采样与抖动
利用逐片元操作,可以实现很多特殊任务的绘制
固定管线 vs 可编程管线
固定管线
用户能控制
用户不能控制
不足:
可编程管线
随着硬件的发展,用户已经可以针对图形处理器(GPU)进行编程
OpenGL提供了相应的机制支持这一点:用户可以编写专门运行于GPU的小程序,而非只能为函数设置有限的参数
通过编写着色器(Shader),用于替代固定流水线中的各个子流水线
着色器,是一种针对GPU编写的,由GPU直接运行的,高度并行化的小程序
固定流水线 vs 可编程流水线
固定流水线
只支持Blinn-Phong光照模型
无法实现
可编程流水线
顶点着色器的应用
顶点的位置计算
顶点的光照计算
片元着色器的应用
纹理映射
简介
OpenGL内置的,专用于编写着色器程序的语言
引进新的数据类型
OpenGL的状态通过内置变量传递
顶点着色器 vs 片元着色器
顶点(片元)着色器是每个顶点(片元)都需要(并行)运行一遍的程序
可编程渲染管线的工作流程
漫反射
光的衰减
Lambertian漫反射
镜面反射项
Blinn-Phong
漫反射项
Blinn-Phong光照模型
局部光照模型的不足
材料由双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)决定
Lambertian Material (BRDF)
光照均匀反射到每一个出射方向
假设入射光是常数
其中,为反照率颜色
Glossy material (BRDF)
Reflective/Refractive material (BSDF)
原理:光路的不断反射传播
Radiance辐射率
处在方向上的辐射能量
一个5D函数,幂
立体角
渲染方程
迭代:
Ray Casting
基本原理:
递归光线跟踪
递归终止条件
在每个相交时,有些光线被吸收
忽略进入无穷空间的光线(或背景光强)
递归步数有限制
算法框架
xxxxxxxxxx
color trace(point p, vector d, int step)
{
color local, reflected, transmitted;
point q;
normal n;
if(step > max) return(background_color);
q = intersect(p,d,status);
if(status == light_source)
return(light_source_color);
if(status == no_intersection)
return(background_color);
n = normal(q);
r = reflect(q,n);
t = transmit(q,n);
local = phong(q,n,r);
reflected = trace(q,r,step+1);
transmitted = trace(q,t,step+1);
return(local+reflected+transmitted);
}
计算效率
大量的求交运算
加速策略
空间组织
Bounding Volume Hierarchy (BVH)
Spatial vs Object Partitions
Whitted光线跟踪算法只是计算了一条反射光路,而不是整个半球面
Path Tracing基本思想
从视点往像素打N条光线
每条光线生成一条光路(path),计算着色
每点按概率只产生一个反射方向
将所有光路的着色进行平均
Monte Carlo积分方法
目标:估计
思想:构造随机变量
令是上的任意概率密度函数,而是密度为的随机变量
令
流程
选择一个概率密度函数
生成个独立的样本
对,计算
返回采样均值
概率密度函数的选择
理论上
实际应用上
均匀分布几乎总是有效的
的选择对估计效率(即收敛速率)有很大的影响
多重重要性采样MIS
为了估计
假设有个概率密度函数对进行采样,则
为的无偏估计只需满足:
平衡启发式权重计算:
则
光线追踪思想
目标:解积分
蒙特卡洛积分:
合并可得:
伪代码
无法收敛问题——俄罗斯赌盘(Russian Roulette RR)
Path Tracing的优化:光源采样
光源采样:
立体角 → 区域积分
渲染方程
伪代码:
阴影射线的可视测试
在渲染方程中增加一项:
伪代码:
Image-Based Lighting (IBL)
用环境映射当作光源
重要性采样
伪代码:
Ray Tracing方法综述
Ray Casting(光线投射)
Ray Tracing(光线跟踪/追踪)
Path Tracing
Bidirectional path tracing (BDPT)
解决的问题:复杂光线
Recall: 一条路径连接摄像机和光源
BDPT
使用多重采样来对路径适当加权
构建传输路径
对于任意,创建光线的子路径以及摄像机子路径(使用局部路径采样)
完整路径由连接两段路径得到:
对每个和,构造的一个概率密度函数
使用多重采样可以结合所有的路径采样结果
其中为权重函数——平衡启发式
分析
Metropolis Light Transport (MLT)
解决的问题:无关路径
关键思想
马尔科夫链的应用
能够高效地构造困难传输路径
Metropolis-Hasting Method
给定非负函数,生成一系列相关的采样,其概率密度函数与成正比
主要优势:不需要为一个概率密度函数
输入:
算法:给定当前采样
从采样得到
令
设置转移到的概率为;否则,设置转移到
从任意初始化状态开始
路径突变
MLT的关键步骤
期望的突变性质
给定一个传输路径,我们需要定义一个传递概率来允许基于采样突变路径
给定该传递概率密度,接受概率表示为:
路径突变策略
扰乱中间一段光路
扰动最后一段光路,从光源回退光路
分析
优点
缺点
Photon Mapping
解决的问题:焦散
核心思想
波粒二象性
非常适合用于生成焦散现象
两阶段方法:
Photon Tracing
Photon collection
分析
有偏逼近
关于渲染中的偏差的理解:
Combine Method
Vertex Connection and Merging (VCM)
Denoise
假定:场景中的物体均为理想漫反射表面(Diffuse)
求解渲染方程:与视点无关,只需求解一次
渲染方程:
另一种形式的渲染方程:
几何项表示为:
可视性项表示为
解渲染方程:
令:
有
又
写成矩阵形式:
又
Radiosity
Hierarchical Radiosity
Instant Radiosity
也叫many-light approaches
关键思想
方法
Many-light Rendering (PointGI)
Matrix Sampling and Recovery via Sparsity Analysis
优点
缺点
Path Tracing based Methods的问题
尽可能地求解渲染方程
实时渲染
实时渲染的速度
时间预算(时间紧迫)渲染
基本思想:简化渲染方程的计算
Point light local shading
Blinn-Phong local shading
Point light local shading + shadow
Shadow map
Environment/area light local shading
Rendering under environment lighting
简化入射辐射度Incident Radiance
逼近incident radiance
简化BRDF
逼近BRDF
加速Visibility
逼近visibility
预计算辐射传输Precomputed Radiance Transfer (PRT)
渲染方程:
称项为光线项,项为光线传输项
用基函数逼近光线
预计算阶段:
运行阶段