内容

多边形网格处理

image.png

  • subdivision 细分
  • simplification 简化
  • regularization 正则化

    细分 subdivision

    细分并不只是把三角形数量提升,而是让它们的位置也随之发生一点细微的变化
    image.png

    Loop subdivision

    image.png
    并不是循环,而是发明这个算法的人叫做loop
    第一步:细分生成新的顶点
    image.png
    区分旧的顶点和新细分出来的顶点。

第二步,调整顶点的位置,让模型更光滑
对于新生成的顶点:
image.png
对于旧的顶点:
位置是顶点原本的位置和周围顶点位置的加权平均和。
这个权用n和u来进行计算,跟顶点的度有关。

  • 度越大,周围顶点的贡献值越大

image.png

Catmull-Clark 细分

image.png
Loop细分是在三角形网格面上进行的,对于一般情况,有不同多边形的网格,是Catmull-clark细分解决的内容
quad
Extraordinary vertex 奇异点,度!=4 的顶点
第一步,细分生成新的顶点
每个面取一个中点,并且连向其边的中点。
image.png
经过一次细分

  • 原先的奇异点还是奇异点
  • 原先的非四边形面消失,
    • 但是其中心点变成了奇异点(因为非四边形面不是四条边,所以中心点的度不为4)

相当于一次细分后非四边形面都变成了奇异点,再继续细分就不可能增加奇异点了。
第二步,调整顶点的位置
image.png

对于新的顶点:

  • 定义面上的点f:周围四个点平均
  • 定义边上的点e:两个端点与两个相邻面的点的平均

对于旧的顶点:

  • 周围4个面点f,四个边点e和自身原来位置进行加权平均

对比loop和catmull-clark
image.png
涉及到缝的问题有严格定义,这是专门的研究方向。

简化 simplification

image.png
在不同情况下用不同复杂程度的模型
类似Mipmap,又是采样的问题。但是几何的层次上做没那么容易,现在有两种解决方案

  • LOD level of details 细节级别
  • UE5 Nanite 多边形虚拟化 详见

边坍缩 Edge Collapsing

image.png
如何确定哪些要坍缩哪些不呢

二次误差度量 Quadric Error Metrics

image.png

现在要去除多边形最上面三个点,新生成一个蓝色的点,求蓝色点放在什么位置,能让新生成的蓝色三角形与原来灰色多边形的大小相似

二次度量误差就是求新的点到与之相关联的点的距离的平方和 (优化过程)
坍缩一条边之后新生成的一个点,放在一个位置,有最小的二次度量误差

实现过程

  • 对于每一条边,都假设对其进行坍缩,会产生多大的二次度量误差
  • 保存所有边的二次度量误差成为一个序列,升序排列后,从最小二次度量误差的边开始坍缩

但是这里会出现问题,当第一条边collapse后,受影响的边位置发生变化,我们需要更新这些边的collapse值大小和序列顺序。简而言之,就是

  • 求最小,
  • 动态更新任何一个值
  • 用优先队列这样的数据结构来做可以满足上面两点需求
  • Greedy algorithm,局部最优解的和被认为是全局最优解

image.png

Shadow Mapping

在之前光栅化到时候,每个点着色的时候只考虑自己,不考虑其他物体也不考虑本物体的其他部分。
但是如果其他物体挡住了原本要到达这个点的光线,就会产生阴影,而不是原先的shader计算结果。
这就是阴影要单独拿出来讨论的原因
在光栅化里面做阴影,用shadow map 储存ShadowMapping技术的结果。
阴影的作用

  • 强化位置感,否则就会有一种浮在空中的感觉
  • 12. Geometry 3 - 图15

Shadow Mapping特性

  • shadow mapping 是一个图像空间的算法,不需要知道场景的几何信息
  • 会产生走样现象,必须要反走样
  • 经典的sm只能处理点光源(硬阴影)

关键思想

  • 如果一个点不在阴影里,那么同时满足
    • 摄像机可以看到这个点
    • 光源可以看到这个点 (如果不满足这条,那就是在阴影里)

      Pass1 : Render form light

      从光源看向场景,记录看到的任何一个点的深度
      12. Geometry 3 - 图16
      得到的深度图中每一个点表示大于这个深度的被遮挡了。

      Pass2A:Render from eye

      从摄像机看向场景,记录看到的任何一个点的深度
      12. Geometry 3 - 图17

      Pass 2B:Project to light

      12. Geometry 3 - 图18

从相机看向场景,对于每一个点,

  • 投影回去光源成像的图片上,找到这个点离光源的深度
  • 实际计算这个点在场景中到光源的深度

如果

  • 两个距离是一致的,说明这个点是可以被光源看到的
    • 12. Geometry 3 - 图19
  • 如果不一致,则说明这个点被遮挡了。
    • 12. Geometry 3 - 图20

这样就得到了结果
12. Geometry 3 - 图21
这是摄像机视角的一张shadow map,里面绿色是可见;
绿色部分有杂点,这个主要是以下原因

  • 数值精度
    • 可以用bia来一定程度避免浮点数的精度问题
  • shadow map的分辨率
    • 分辨率太低导致一个像素记录了很大一块区域的信息
    • 这样就会投影出来一个有锯齿的阴影

      软阴影和硬阴影

      因为光源有一定的大小,所以就有了软阴影
      12. Geometry 3 - 图22
      umbra 本影,完全看不到光源的地方
      penumbra 半影,能看到部分光源
      所以点光源是不可能有软阴影的。