c++生成nurbs曲面文件_使用曲面细分丰富原始多边形

曲面细分

光栅化图形渲染管线下,还有一部分需要我们进行详细的说明。曲面细分不单可以细分图元(简单的Flat Tessellation),还可以生成曲面(PN-Triangles),这是流水线中其它阶段所做不到的。

除此之外,使用它的一些优点:

  • 实现动态

  • 物理模拟更具效率

  • 节约内存

曲面细分阶段在整个渲染管线中的位置:

顶点着色器外壳着色器镶嵌器域着色器曲面细分阶段几何着色器像素着色器

然后简单说一下TS这三步中的Hull Shader:

  • 外壳着色器(Hull Shader),分为两个Phase:
    • :主要提供了细分因子和patch中的其它常量,并且这部分对所有Input Control Points和Output Control Points都可以进行只读的操作,意味着它可以写在Control Points Hull Shader之前或之后。

    • :对每个控制点(即顶点)执行一次,生成Output Control Points,可以使用ControlPointID进行获取访问。

Flat Tessellation

首先来看看Flat Tessellation,我们选择任何一个低模的静态模型或者骨骼动画,它所表现的物理模拟或者光照都是粗糙的,对于曲面细分着色器最简单直接的使用就是直接在每个基本图元(比如三角形)上划分出更多的图元,只需要在Constant Hull Shader中添入必要的细分因子,将Control Point Hull Shader当作Pass Through Shader来处理,Domain Shader进行相应的坐标变换即可。

PN(Point-Normal) Triangles

到了这步,其实我们就踏入了通过控制点来实现贝塞尔曲线效果的领域了,对于一些低模的提升就有了质的飞跃,我们不单有了动态生成的顶点,还有了对应的法线,自然而然的,外形上的一些棱角就可以变得圆滑,光照的计算由于有了更多的法线向量而变的精确。而且这种方法的另一个好处就是不需要改变原有使用TriangleList的IndexBuffer,三角形的三个顶点就是我们的3个控制点,因此IndexBuffer的长度上就保持了一致,使得实现更容易。

具体文章可以参考Curved PN Triangles[1],主要就是为了获取Geometry以及Normal:

1801743c7c966660adfc8995411994f6.png
0f21dac75d4c11bfb72ee206a0a4f772.png

这里的UVW是重心坐标,从标识SV_DomainLocation中获得。

以下是UE4中的曲面细分对比图:

5f217f46ceb97315d102153a0a4a393c.png
转自UE4官方文档,曲面细分对比图

PN-AEN(Adjacent-Edge-Normal) Triangles

这个方法其实是为了解决PN Triangles算法容易出现的交界处断开的问题,它使用了9个控制点,也就意味我们要在原有Index Buffer的基础上进行一些修改,下面这张示意图展示了新Buffer的构成:

0b61981112f2466304d6573ff64dce09.png
每个Patch中的9个索引值

关于这个Tessellation buffer的生成,我们首先将原有的Index Buffer记作SIB,顶点缓冲记作SVB,输出的Tessellation Buffer记作OIB,然后接下来提供一种来自NVIDIA的可行算法:

  • Step 1. 创建一个OIB,缓冲区的大小为SIB的3倍大

  • Step 2. 遍历每个SIB中的三角形,顶点索引记作:

    • a. 依照上面的索引示意图初始化OIB,即每个Patch为

    • b. 通过索引值在SVB中查找顶点位置信息,记为

    • c. 定义三条边(Edge),每个Edge包含了两个索引值和两个位置值。即IndexFrom、IndexTo、VertexFrom以及VertexTo

    • d. 对于每个Edge,将其'反转'的结果储存到HashMap中(hash_map),方便查找。这里的反转就是以IndexTo和VertexTo初始化IndexFrom和VertexTo

  • Step 3. 遍历上一步生成的OIB,对于每个拥有9索引值的Patch,执行:

    • a. 对每个当前Patch中的Edge,在Map中进行查找对应的Edge

    • b. 如果找到,用在Map找到的Edge的Indices来替换当前的Indices。(匹配的条件是IndexFrom和IndexTo相同或者VertexFrom和VertexTo相同)

    • c. 如果没有,继续使用当前的Indices

详细的实现这里就不写了,可以参考UE4工程里的源码,然后Shader可以参考NVIDIA的PN-AEN Triangles白皮书[2]

参考资料

[1]

Curved PN Triangles: http://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Vlachos00.pdf

[2]

PN AEN Triangles: https://developer.download.nvidia.com/whitepapers/2010/PN-AEN-Triangles-Whitepaper.pdf

- END -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值