Loop Subdivision
for GAMES 101 Final Project
built on May 4th,2020
前言
在作业中,我们实现了 displacement 贴图以改变对象的几何形状并添加令人 惊叹的表面细节。但是,为了捕获更加精细的细节,我们需要具有非常小且多的三 角形网格。为了解决这个问题,我们可以使用动态的细分方法。根据 displacement 贴图指定的信息,仅在需要时才将大的多边形细分。之后,将动态细分的网格发 送到图形管道中。在此项目中,你可以在 CPU 中把需要细分的三角形使用 Loop 细分,然后使用任何渲染方法将它显示出来,而不需要使用 GPU 编程。
实现原理
Loop Subdivision算法简述
Loop细分是一种三角网络的细分法则。算法主要就是把1个旧三角面片分成4个新三角面片,使用半边数据结构。具体:每次细分,每条边上计算插入一个新顶点,同时每个原始顶点更新位置。边界边/点和非边界边/点按不同策略插入/更新坐标。
更新策略
每条边上新插入的点计算坐标后暂时存储在边结构的newPos变量中,每个旧顶点计算完更新后顶点位置后暂时存储在顶点结构的newPos变量中。
更新策略如下图所示,图上为非边界情况的更新策略,图下为边界情况的更新策略。
三角面细分操作
采用如下策略进行三角面的划分:
- Split:对每一条旧边执行split操作,可按任意顺序执行。具体操作为:按照该边中存储的前一步已计算好的新顶点的坐标将该边断成两条边,并插入2条边连接新顶点与所处三角形的对角顶点(如果该边是边界,则新插入的边为1条)。
- Flip:对连接新旧顶点的新插入的边(新插入——不是由断裂原有边形成)进行flip操作。
开发环境
系统 | 信息 |
---|---|
操作系统 | Windows Subsystem for Linux |
处理器 | Intel© Core™ i5-8250U CPU 1.60GHz 1.80GHz |
内存 | 8GB |
显卡 | GeForce MX150 |
编译器 | gcc 7.5.0 |
编译工具 | Cmake 3.10.2 |
编译
$ mkdir build
$ cd build
$ cmake ..
$ make
运行
$ ./loop input.obj output.obj