我的github

在几何阶段,还有一个可选的着色器,曲面细分着色器(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是通用处理器,几何运算性能有限,不能无限制的增加多边形数量。这也是我们在一些游戏中看到人的脸“棱角分明”的缘故。

posted on 2023-02-28 13:51  XiaoNiuFeiTian  阅读(290)  评论(0编辑  收藏  举报