opengles中的Tessellation(曲面细分)
发表于2018-03-27
从opengles3.2开始,支持了一项新的特性,Tessellation Shader,这是一个新的shader,发生在顶点处理阶段,曲面细分可以在显卡上动态生成新的顶点和面,这在支持gles3.2的设备上,可以用来表现模型的lod,我们不用传输大量的顶点数据给显卡,而使显卡能够根据一定规则自动生成细节层次更多的顶点。也有应用结合高度图生成细节更加复杂的模型,因为不用再cpu这边准备高面数的模型,减轻了内存和cpu的负担,使用建模表现高模的一种硬件加速方法。
因为支持gles3.2的设备还不多,所以还找不到太多应用这个新特性的例子,不过可以先看下3.2新的管线
可以看到早vertex shader后面新加了三道流程,Tessell Control Shader,Tessellation Primitive Generator,Tesselation Evaluation Shader。这三者共同完成曲面细分的硬件处理。
1. 首先是TCS,这是一个可编程管线,但是是可选的,如果没有会使用一个默认的参数。它的输入是patch原语。我们知道原语比较典型的有点 线 三角形 四边形,在tessellation这里多了一种原语patch,一个patch不是一个点也不是一个三角形,而是一个顶点序列,这个顶点序列就是产生细分曲面的基础顶点。在这个过程中一般要定义生成多少个细分曲面,这个要定义两个量,innersize,outsize。这里还可以对patch做一些调整操作,设置每个patch的序列长度,这些量将在下一个过程使用。
2. 然后是TPG,这是一个固定管线,它负责真正的进行曲面细分,它利用上一步进来的patch,以及innersize ,outsize,以及space策略细分曲面,如下图
对外围的三角形进行了曲面细分后,生成了中间更多的顶点。这里面的输出是细分后的每个顶点及其顶点属性,在这里的顶点位置属性是相对的在0-1之间。
3. 最后一步是TES,这是一个编程管线,且必须有,如果没有这个shader,则不发生曲面细分。这个shader将根据上一步进来的每个细分产生的顶点的绝对坐标,生成顶点真实的坐标。