在几何阶段,还有一个可选的着色器,曲面细分着色器(Tessellation Shader)。它的作用是把由顶点数据组成的Patch细分成更小的图元( patches of vertex data are subdivided into smaller Primitives. )
Patch is just an ordered list of vertices (在tessellation shader里面比较重要的概念就是这个patch,patch是一系列的顶点,OpenGL规定patch的vertex数量必须至少大于等于3)
三角形细分技术的好处?
The tessellation process doesn’t operate on OpenGL’s classic geometric primitives: points, lines, and triangles, but uses a new primitive called a patch (Tessellation shader就是针对patch来进行处理的而并非点,县,三角形)
Patch – are processed by all of active shading stage in the pipeline (patch可被所有的shader处理)
Two shading stages of Tessellation shading:
1. Tessellation Control Shader (optional)
In tessellation control shader, gl_PatchVerticesIn provides the number of elements in gl_in (gl_in 用于在tessellation control shader里面访问传进的来patch里面的顶点)
gl_out 用于控制patch里面的vertex从tessellation control shader输出后的属性
gl_InvocationID is used to access the specific vertex of a patch (gl_InvocationID 用于访问传入patch里的特定顶点)
Layout (vertices = *) out; (用于指定输出的patch里面有多少个顶点)
gl_TessLevelInner
Specify how the interior of the domain is subdivided and stored in a two element array named gl_TessLevelInner(指定多边形内部如何细分)
gl_TessLevelOuter:
Control how the perimeter of the domain is subdivided, and is stored in an implicitly declared four-element array named gl_TessLevelOuter(指定多边形边界上的边被如何细分)
gl_TessLevelInner & gl_TessLevelOuter 根据多边形内部区域的类型会有不同的分割法
参考:https://blog.csdn.net/weixin_30745641/article/details/97044070
整个Tessellation的过程,被分为三个阶段:
- The Tessellation Control Shader (TCS)
- The tessellation primitive generator
- The Tessellation Evaluation Shader (TES)
其中 TCS是可选的,如果不做操作,可以用default tesselation values。在这一步,可以决定细分的数量,和对输入的数据进行特殊转换。可以增删顶点,但是不能删掉整个Patch。这个阶段,对应了DX的HS(Hull Shader)。 第二个阶段,是不可编程的固定方法,只有TES激活的状态下,才会执行。主要用来创建点。
这里有三个小视频演示了,一个三角形分别用equal_spacing( [1, 64]), fractional_even_spacing( [2, 64]), fractional_odd_spacing( [1, 63]) 三种方式分割出来的效果。
Tessellation(网格细分技术)的应用:
- 平滑网格
- 跟置换贴图配套使用
- 实现连续分级(LOD)
- 贝赛尔曲线
应用示例:
(1)远近不同的细分方法
一个球体有1200面,我们就可以利用Tessellation,一开始做一个面数比较低的球体来做LOD分级,比如不一样的远近或者不一样的机型,动态增加面数。
(2)根据三角形边在屏幕上的大小,来调整细分的程度。
参考:https://zhuanlan.zhihu.com/p/332372618
>>曲面细分(镶嵌化处理技术):计算机不能直接生成曲线,当然更不能直接生成曲面。我们在计算机屏幕上看到的曲线、曲面实际上是由无数个多边形构成的(栅格化之后的)。当然多边形越多,那么曲面就会展现的更为真实。在之前,这项工作都是由CPU完成的,但是CPU是通用处理器,几何运算性能有限,不能无限制的增加多边形数量。这也是我们在一些游戏中看到人的脸“棱角分明”的缘故。