【图形学/CG/Loop 细分/ Loop Subdivision】Loop Subdivision for GAMES 101 Final Project

Loop Subdivision

for GAMES 101 Final Project
built on May 4th,2020

前言

image-20200504133358963

在作业中,我们实现了 displacement 贴图以改变对象的几何形状并添加令人 惊叹的表面细节。但是,为了捕获更加精细的细节,我们需要具有非常小且多的三 角形网格。为了解决这个问题,我们可以使用动态的细分方法。根据 displacement 贴图指定的信息,仅在需要时才将大的多边形细分。之后,将动态细分的网格发 送到图形管道中。在此项目中,你可以在 CPU 中把需要细分的三角形使用 Loop 细分,然后使用任何渲染方法将它显示出来,而不需要使用 GPU 编程。

实现原理

Loop Subdivision算法简述

Loop细分是一种三角网络的细分法则。算法主要就是把1个旧三角面片分成4个新三角面片,使用半边数据结构。具体:每次细分,每条边上计算插入一个新顶点,同时每个原始顶点更新位置。边界边/点和非边界边/点按不同策略插入/更新坐标。

更新策略

每条边上新插入的点计算坐标后暂时存储在边结构的newPos变量中,每个旧顶点计算完更新后顶点位置后暂时存储在顶点结构的newPos变量中。

image-20200504135917192

更新策略如下图所示,图上为非边界情况的更新策略,图下为边界情况的更新策略。

image-20200504135936070

三角面细分操作

采用如下策略进行三角面的划分:

  • Split:对每一条旧边执行split操作,可按任意顺序执行。具体操作为:按照该边中存储的前一步已计算好的新顶点的坐标将该边断成两条边,并插入2条边连接新顶点与所处三角形的对角顶点(如果该边是边界,则新插入的边为1条)。
  • Flip:对连接新旧顶点的新插入的边(新插入——不是由断裂原有边形成)进行flip操作。

image-20200504135950441

开发环境

系统信息
操作系统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

效果

bunny

image-20200504133707642 image-20200504133834153

teapot

image-20200504134103022 image-20200504134227795

视频展示

原理讲解

运行展示

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值