曲面细分
光栅化图形渲染管线下,还有一部分需要我们进行详细的说明。曲面细分不单可以细分图元(简单的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:
这里的UVW是重心坐标,从标识SV_DomainLocation中获得。
以下是UE4中的曲面细分对比图:
PN-AEN(Adjacent-Edge-Normal) Triangles
这个方法其实是为了解决PN Triangles算法容易出现的交界处断开的问题,它使用了9个控制点,也就意味我们要在原有Index Buffer的基础上进行一些修改,下面这张示意图展示了新Buffer的构成:
关于这个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 -