曲面细分名词

TCS(细分控制着色器)

Tessellation control shader细分控制着色器
TCS 着色器获取由顶点处理器处理之后的数据
顶点在经过顶点着色器后 在顶点着色器中通过gl_Position = pos;输出 接着就会将这些顶点按照数组gl_in[]的方式传递给细分控制着色器(也就是说在细分控制着色器中 可以调用gl_in[]数组来获取从顶点着色器传入的顶点)而gl_in[]的大小 也就是多少个顶点算一组(gl_in[0],gl_in[1]…具体到gl_in[x]之后从gl_in[0]重新开始)由glPatchParameteri(GL_PATCH_VERTICES, 3);决定 现在就是gl_in[2]是最大的

并输出 patch

除此之外它也会产生 TLs

TES(细分曲面计算着色器)

Tessellation EValuation shader

输入为 质心坐标
输出为 顶点
每次调用只能生成一个顶点 不能丢弃顶点

TES的作用

TES 着色器的主要目的就是借助于 PG 阶段生成的坐标来生成曲面

将质心坐标变换到表示曲面的多项式中并计算出最终结果。结果就是新的顶点的位置
在 TES 着色器执行之后,产生的新的顶点会被作为三角形传递到渲染管线的下一阶段
所有生成的位于这个特定空间下的位置都会经过 TES 着色器进行处理

tes的偏移纹理实际上就是高度纹理,它记录了颜色纹理中每个像素在所在位置的高度信息。我们将会使用高度纹理在我们的网格模型的表面上产生起伏的状态。除此之外,TES 也可以访问 TCS 着色器的输出 patch。最后我们声明输出的顶点的属性。需要注意的是默认数组并没有在这里

控制点


这些被称为控制点的顶点定义了一个曲面

patch

一组顶点被称为一个patch
由glPatchParameteri(GL_PATCH_VERTICES, 3);设置多少个顶点为一个patch 这里为三个顶点组成一个patch
每一个patch执行一次细分计算着色器 也就是 假设我们是三个顶点为一组patch 那么顶点依次经过顶点着色器 传入细分控制着色器 但是并不会像流水线一样 顶点从顶点着色器传入细分控制着色器时 立即执行细分控制着色器 然后从细分控制器传出 而是等待三个顶点都从顶点着色器传入时才执行细分控制着色器再传出 此时这三个顶点组成一个patch 从控制着色器传出

上图为 绘制了6个点 但是一个patch是三个点组成
每个输出 patch,我们可以有不同的 TLs 值

TLs(曲面细分精细程度)

gl_TessLevelOuter [0] gl_in[0]顶点对应的那个边有多少个新生成的顶点数量
gl_TessLevelInner[0] 确定三角形中将会包含多少个圈
在三角域里面我们只需要使用 gl_TessLevelOuter 数组的前三个成员以及 gl_TessLevelInner 数组的第一个成员
在矩形域中 gl_TessLevelInner[0]是横 gl_TessLevelInner[1]是竖

例子

int TL = 3;//设置细分程度gl_TessLevelOuter[0] = 5; gl_TessLevelOuter[1] = TL;gl_TessLevelOuter[2] = TL;//gl_TessLevelOuter[3] = TL;gl_TessLevelInner[0] = TL; //gl_TessLevelInner[1] = TL;

固定功能阶段为图元生成(PG)

实际上就是这个部分进行设置 然后生成新的点

layout(Triangles,equal_spacing,ccw) in;

PG 借助于 TLs 中的信息并在此基础上在三角形内部生成一系列的点。每个点都是由这个三角形的质心坐标系确定的
在一般情况下 TLs 告诉 PG 三角形边上的线段的数量,并且一环一环的绕着三角形的中心来构造三角形

PG 阶段通过获取从 TCS 着色器中传入的 TLS(细分层级)以及其输出的拓扑结构,PG 会生成这个空间下的顶点信息和其生成的顶点的连通性;

图元生成器

将从细分控制着色器传进来的patch创建一组新的图元。
图元生成器计算不同数量的细分曲面程度并应用不同的细分曲面算法。每个所生成的顶点在一个抽象patch内具有一个规格化的位置(即,坐标范围在[0, 1]之内)。这个位置具有两个或三个分量,依赖于patch的类型。这些坐标通过内建的in vec3 gl_TessCoord;
输入提供给细分曲面计算着色器。

图元生成:

  1. 不受细分曲面控制着色器中用户定义的输出影响(或当没有细分曲面控制着色器时,也不受顶点着色器的影响)
  2. 不受细分曲面控制着色器的输出patch大小影响,
  3. 不受任一每个patch的细分曲面控制着色器输出的影响,
  4. 只受细分曲面程度的影响。
  5. 细分曲面阶段的图元生成部分完全对实际的顶点坐标与其它patch数据是不可见的。

图元生成系统的目的:

  1. 确定要生成多少个顶点
  2. 用哪个次序来生成它们
  3. 用哪种图元来构造它们。
    实际为这些顶点的每个顶点的数据,诸如位置、颜色等等,是通过细分曲面计算着色器来生成的,基于图元生成器所提供的信息。

总结着色器的作用

顶点着色器

网格顶点经过顶点着色器处理之后得到了世界坐标系下的位置、法线

细分曲面着色器

细分曲面过程并不对OpenGL典型的几何图元(点、线和三角形)进行操作,而是使用一个新的图元patch

如果企图渲染一个patch而没有任何细分曲面着色器(明确地说是一个细分曲面计算着色器;我们会看到细分曲面控制着色器是可选的),那么将也会得到一个GL_INVALID_OPERATION错误

TCS着色器

TCS 将每个三角形作为一个带三个控制点的 patch 并直接将其传递到 TES 中

gl_in中的元素个数与由glPatchParameteri()所指定的patch大小相同。在一个细分曲面着色器内部
变量gl_PatchVerticesIn提供了gl_in中的元素个数(就好比使用sizeof(gl_in) / sizeof(gl_in[0])进行查询)。

glPatchParameteri()设置了gl_in数组的数组大小

layout (vertices = 16) out;的作用

1.设置了gl_out数组的数组大小 设置输出patch顶点的个数为16
2.指定了细分曲面控制着色器将被执行多少次:对每个输出patch顶点执行一次。

gl_InvocationID变量

确定正在处理哪个输出顶点 该变量作为gl_out数组的一个索引

工作流程

生成细分曲面输出patch顶点,传递到细分曲面计算着色器,以及更新任一每个顶点的,或每个patch的属性值,若有必要的话。

指定细分曲面程度因子,控制图元生成器的操作。这些是特殊的细分曲面控制着色器变量,称为gl_TessLevelInner和gl_TessLevelOuter,并在细分曲面控制着色器中隐式声明。

TES着色器

PG 将一个等边三角形细分成多个小三角形并且为每个新产生的顶点都执行 TES 着色器
在每次的 TES 调用中,我们都可以访问顶点的质心坐标

对图元生成器发射的每个细分曲面坐标逐个执行,并负责确定从细分曲面坐标所得到的顶点的位置

layout(points, equal_spacing, ccw) in;

  1. Triangles 这是 PG 的工作域,其他两个选项是 quads 和 isolines;
    point_mode也可以生成点 迫使细分曲面的生成作为一系列的点
    ・ quads——单位正方形中的一个矩形域;域坐标:带有范围在[0, 1]内的u, v值的一个个坐标对(u, v)。
    ・ triangles——使用重心坐标的一个三角形域;域坐标:带有范围在[0, 1]内的a、b、c三个值的坐标(a, b, c),这里a+b+c=1。
    ・ isolines——跨单位正方形的一组线;域坐标:u值范围在[0, 1],v值范围在[0, 1)范围的(u, v)坐标对。

point_mode也可以生成点 迫使细分曲面的生成作为一系列的点
layout (triangles, equal_spacing, ccw, point_mode) in;

  1. equal_spacing 意味着三角形的边缘会被细分成等分的线段(根据 TLs)。你也可以使用 fractional_even_spacing 或者 fractional_odd_spacing 使得在线段长度上获得更加平滑的过渡,不论 TL 值是一个奇数整数还是一个偶数整数。例如,如果你使用 fractional_odd_spacing 并且 TL 值为 5.1,这意味着会有两个非常短的线段和 5 个比较长的线段。随着 TL 值增加到 7,所有线段的长度会变得十分接近。当 TL 值达到7,两个新的十分短的线段会被创建出来。fractional_even_spacing在处理偶数TL值时也是一样;
    ・ equal_spacing——细分曲面程度被裁减到[1, max]范围内,然后取整到下一个最大整数值。
    ・ fractional_even_spacing——值被裁减到[2, max]范围内,然后取整到下一个最大偶整数值n。边然后被划分为n-2条等长部分,以及两个剩余部分,每个在一端,剩余部分长度可能比其它长度要短。
    ・ fractional_odd_spacing——值被裁减到[1, max-1]范围内,然后取整到下一个最大奇整数值n。边然后被划分为n-2条等长部分,以及两个剩余部分,每个在一端,剩余部分长度可能比其它长度要短。

  2. ccw 意味着 PG 中输出的三角形会按照逆时针顺序(你同样可以使用 cw 将其设定为顺时针顺序)。你也许会想,在顺时针为正面的情况下为什么我们还要将其设置为逆时针方向。这是因为在这一节中我使用的模型( quad2.obj )是用 Blender 按照逆时针顺序生成的,我本应该在导入模型的时候将 Assimp 标志设置为 ‘aiProcess_FlipWindingOrder’ 这样在这里我们就能使用 cw 。我现在只是不想去修改 mesh.cpp 中的内容,底线就是无论你做什么,都要保证他们始终是一致的。

函数

glPatchParameteri(GLenum pname, GLint value)

使用value来指定一个patch中的顶点个数。pname必须设置为GL_PATCH_VERTICES。

  • 如果value小于零或大于GL_MAX_PATCH_VERTICES,将会产一个GL_INVALID_ENUM的错误。
  • 一个patch的默认顶点个数是三。如果一个patch的顶点个数小于参数value值,那么该patch将被忽略,从而不会有几何图形产生。

glPatchParameterfv(GLenum pname, const GLfloat *values);

当没有细分曲面控制着色器时,设置内部与外部细分曲面程度。

  • 参数pname要么是GL_PATCH_DEFAULT_OUTER_LEVEL,要么是GL_PATCH_DEFAULT_INNER_LEVEL。
  • 当pname是GL_PATCH_DEFAULT_OUTER_LEVEL时,参数values必须是含有四个单精度浮点值的数组,指定四个外部细分曲面程度。
  • 类似地,当pname是GL_PATCH_DEFAULT_INNER_LEVEL时,values必须是含有两个单精度浮点值的数组,指定两个内部细分曲面程度。

barrier()(GLSL内置函数)

该函数使得对于一个输入patch的所有控制着色器执行并等待所有这些着色器的执行到达那个函数的调用点,从而确保了可能要设置的所有数据值将被计算。
因为一个细分曲面控制着色器在执行时,它具有对所有patch顶点数据的访问,包括输入顶点和输出顶点。这可能会导致发射一次着色器调用,该调用需要使用来自另一个着色器调用的数据值,但是那个着色器调用尚未发生

gl_in数组实质

in gl_PerVertex {vec4 gl_Position;float gl_PointSize;float gl_ClipDistance[];}gl_in[gl_PatchVerticesIn];

GLSL内置变量

gl_InvocationID:当前细分曲面着色器的输出顶点的调用索引 就是在一组patch中 这是第几个顶点

gl_PrimitiveID:当前输入patch的图元索引 也就是 这是第几个patch

gl_PatchVerticesIn:输入patch中的顶点个数,它作为gl_in数组变量中的元素个数
gl_TessLevelOuter[0]: 用于确定三角形每个边线上的线段的数量

gl_TessLevelInner[0] 确定三角形中将会包含多少个圈
在三角域里面我们只需要使用 gl_TessLevelOuter 数组的前三个成员以及 gl_TessLevelInner 数组的第一个成员

gl_PatchVerticesOut:输出patch中的顶点个数,它作为gl_out数组变量中的元素个数

gl_TessCoord:作为权值在二维向量和三维向量之间插值 有三个分量 代表与图元细分相关的被处理顶点的位置

流程

第一步是先把顶点传入顶点着色器
然后将顶点着色器中的顶点传入TCS着色器
在程序中通过glPatchParameteri设置组成patch的顶点数量
在TCS着色器中通过layout(vertices = 4) out; 设置传出patch的顶点数量
在TCS着色器中设置细分等级和细分程度
那传入TCS的目的是什么 1.设置细分程度 因为在这里可以计算摄像机和控制点的距离(控制点实际上就是从顶点着色器传进来的点)
2.将所有顶点分成patch
在TES着色器中获取从TCS传入的patch数组

TES的目的是什么 设置PG 这个PG应该会自己对整个曲面进行细分 但是获取不到相应的点

OpenGL-曲面细分相关推荐

  1. openGL曲面细分

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.OpenGL 中的曲面细分 二.代码 1.主程序c++ 效果 前言 术语Tessellation(镶嵌)是指一大类设计活动,通常 ...

  2. [OpenGL] 曲面细分特性实践

    参考资料: https://www.nvidia.cn/object/tessellation_cn.html https://www.opengl.org/wiki/Tessellation 背景 ...

  3. OpenGL Tessellation细分曲面的实例

    OpenGL Tessellation细分曲面的实例 先上图,再解答. 正常显示,细分之前 按下M键,细分之后 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示,细分之前 按下M键,细分之后 ...

  4. openGL贝塞尔曲面细分

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.贝塞尔曲面细分原理 二.代码 1.主程序c++ 效果 前言 现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面. ...

  5. 【一步步学OpenGL 31】 -《PN(Point-Normal)三角形曲面细分》

    教程 31 PN(Point-Normal)三角形曲面细分 原文: http://ogldev.atspace.co.uk/www/tutorial31/tutorial31.html CSDN完整版 ...

  6. OpenGL中的曲面细分和几何着色器

    [摘要]本文我们先介绍OpenGL中的曲面细分的一些基本概念,然后给两个例子说明不得不用这项技术的理由. 曲面细分是OpenGL 4.0之后才定义的功能,使用之前请确认你的显卡驱动支持OpenGL4. ...

  7. Surface Shaders with DX11 / OpenGL Core Tessellation 表面着色的曲面细分 - Unity Shader Reference 系列5

    Surface Shaders with DX11 / OpenGL Core Tessellation DX11/OpenGL核心下表面着色器的曲面细分 本文档主要是对Unity官方手册的个人理解与 ...

  8. OpenGL深入探索——曲面细分

    转载自:曲面细分[对翻译欠妥的地方进行了修正,增加了程序运行结果图,并进行补充说明] 原文链接:英文原文​​​​​ 背景 曲面细分( Tessellation )是 OpenGL4.x 中的一个令人兴 ...

  9. java nurbs几何库_OpenGL超级宝典笔记——NURBS与曲面细分

    NURBS 贝塞尔曲线的缺点是当我们增加很多控制点的时候,曲线变得不可控,其连续性会变差差.如果控制点很多(高阶曲线),当我们调整一个控制点的位置,对整个曲线的影响是很大的.要获得更高级的控制,可以使 ...

  10. 使用Canvas + Path和“曲面细分”算法实现钢笔笔锋效果

    本文用于在无法获取压感的设备上实现书法效果,因此所有的书写效果的笔触粗细变化,均是通过速率进行确认.最后实现效果如下(不会书法,只能让大家体会一下效果),代码基于之前的文章在安卓中结合使用GLSurf ...

最新文章

  1. linux/windows nginx安装
  2. java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...
  3. 第一个 Windows 应用程序
  4. 基于keras的深度学习基本概念讲解——深度学习之从小白到入门
  5. Python 字典的操作
  6. Resolving Strong Reference Cycles for Closures
  7. 信用非常良好,为何银行不给你批信用卡?
  8. 漫步线性代数五——三角分解和行交换
  9. mysql5.7 java读取乱码
  10. 王爽 汇编语言程序课程设计1
  11. NetBeans配置subli
  12. 图解大数据 | 大数据分析挖掘-Spark初步
  13. 两个次序统计量的联合密度函数
  14. 计算机项目符号操作,word项目符号和编号的操作方法-word技巧-电脑技巧收藏家...
  15. android 手机处理器,安卓手机处理器性能排行 你的手机能排第几?
  16. 如何采用一套程序代码,实现系统的“千人千面”
  17. pip install报错 There was a problem confirming the ssl certificate…
  18. Unity 3D模型动画导出为帧序列
  19. 项目实训第四周第二次记录
  20. 智能温室的优缺点,你都知道哪些?

热门文章

  1. IEEE754浮点数标准
  2. 外贸综合型进出口内贸企业管理解决方案
  3. 用python画雪花飘落_python实现雪花飘落效果实例讲解
  4. 【正则表达式】字符与运算符
  5. MBR15200FAC-ASEMI塑封肖特基二极管MBR15200FAC
  6. 陕西省土地规划资质办理流程及申请条件
  7. 数字IC(SoC)低功耗设计方法总结
  8. mysql数据表损坏的常见原因是_MYSQL数据表损坏的分析
  9. 020 怎样才可以把py文件前面的小箭头去掉
  10. ccsa安学网小程序_CCSA安学网题库1