曲面简化
曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,减小开销,如远处模型使用曲面简化。
边塌陷:将一条边的两个顶点合成为一个顶点。
确定进行边塌陷的边通过二次度量误差。
二次误差度量:希望把这个点放到一个位置上,使得这个点到原来的几个面的距离平方和最小。
即蓝色新顶点所在的位置与原来各个平面的垂直距离之和。如果能够使得这个误差最小那么对整个模型样貌修改一定程度上也会较小。
曲面简化算法流程:
- 为模型每条边赋值,其值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差度量
- 选取权值最小的边做坍缩,新顶点位置为原来计算得出使得二次误差最小的位置
- 坍缩完之后,与之相连其他的边的位置会改动,更新这些边的权值
- 重复上述步骤,直到到达终止条件
- 优先队列/堆
- 贪心算法,局部最优解而非全局最优解
本节课主要继续了几何部分的讲解,最后还填补了之前对阴影图的补充。
几何(网格处理)
曲面细分(Mesh subdivision)
曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,使模型越来越光滑,提高渲染效果。
Loop细分
Loop细分并非是指循环细分,而是指Loop这个人提出来的细分规则,只能针对于三角形。
步骤大致可以分为两步,首先是生成更多的顶点,然后调整这些顶点的位置,具体步骤如下:
1、将每个三角形分为四个三角形
2、调整这些顶点的位置 。把顶点分为两类:新生成的顶点和老的顶点。
a.对新的顶点进行加权平均,与新顶点在一条直线上的两个顶点权重较大,为3/8,距离较远的点权重较小。
b.对老的顶点进行加权平均,其中n表示老顶点的度,u的大小与n有关,老顶点的位置调整不但取决于与之相连的顶点,也与自己原本的位置有关。
以下给出一个Loop细分的示例图:
Catmull-Clark细分
首先定义面和顶点类型:
- quad face:四边形面
- Non-quad face:非四边形面
- Extraordinary vertex :奇异点(degree != 4,即度(点所连边数)不为4的点
细分步骤:
取每条边,每个面的中点并连起来。每个非四边形都引入了一个奇异点,非四边形面消失。
细分特点:
- 有几个非四边形面,就会多出几个奇异点,所以现在一共有2+2 = 4个
- 新多出来的奇异点的度数与原来所在面的边数相等,如这里就是3度
- 第一次细分之后所有面都会变成四边形,且往后奇异点数目不再增加
计算方法:
曲面简化(Mesh Simplification)
曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,减小开销,如远处模型使用曲面简化。
边塌陷:将一条边的两个顶点合成为一个顶点。
确定进行边塌陷的边通过二次度量误差。
二次误差度量:希望把这个点放到一个位置上,使得这个点到原来的几个面的距离平方和最小。
即蓝色新顶点所在的位置与原来各个平面的垂直距离之和。如果能够使得这个误差最小那么对整个模型样貌修改一定程度上也会较小。
曲面简化算法流程:
- 为模型每条边赋值,其值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差度量
- 选取权值最小的边做坍缩,新顶点位置为原来计算得出使得二次误差最小的位置
- 坍缩完之后,与之相连其他的边的位置会改动,更新这些边的权值
- 重复上述步骤,直到到达终止条件
- 优先队列/堆
- 贪心算法,局部最优解而非全局最优解
shadow mapping
Shading Point没有考虑其他物体的影响,所以着色不能解决阴影。
Shadow mapping本质上是一种图像空间做法,生成shadow这一步不需要这个场景的几何信息,但同样存在走样问题。
Shadow mapping生成硬阴影,不生成软阴影。
shadow mapping具体操作:
key idea: 一个点,如果不在shadow里,你又能看到这个点,说明这个点可以从camera中看到,也可以从光源中看到。
- 从光源看向场景,记录看到的点的深度。
- 从摄像机看向场景,并投影回光源所在的成像上。
-
- 如果与上一步记录的深度一致:说明能看到
- 深度不一致:摄像机能看到,但是光看不到则形成阴影
- 如果与上一步记录的深度一致:说明能看到
shadow mapping最终效果:
可视化shadow maps:
shadow mapping存在的问题:
- 浮点数难以判断相等,所以一般会有一个tolerance
- shadow maps查询时不采用双线性插值,只寻找最近的点,因为倘若插值发生在物体边缘时,与邻接点的深度差距很大,会导致插值结果会有很大的误差
- 属于硬阴影,只适用于点光源
硬阴影vs软阴影 很容易看到硬阴影边缘十分锐利,软阴影较为柔和。