您的位置:首页 > 运维架构

Tessellation(OpenGL镶嵌)

2013-12-21 15:10 176 查看
镶嵌

原文地址:http://www.opengl.org/wiki/Tessellation

镶嵌是顶点处理阶段,在OpenGL渲染管线,其中顶点数据的补丁被细分成更小的基元。这个过程是由两个着色阶段和一个固定功能阶段管辖。

注:此介绍的是OpenGL 4.0功能,而不是旧gluTess *镶嵌功能。

镶嵌过程分为形成的可选部分三个阶段顶点处理渲染管线。两个阶段的可编程;它们之间是一个固定功能阶段。它们在下面描述的,在它们的处理顺序。

通常,细分的过程涉及细分某种类型的补丁,然后对每个由该方法生成的顶点计算新顶点的值(位置,颜色,纹理坐标等)。镶嵌流水线的各阶段执行该过程的一部分。

曲面细分控制着色器(TCS)的多少决定细分活动(它也可以调整实际补丁数据,以及进料额外的补丁数据到后期阶段)。因此,TCS主要负责确保整个补丁的连续性。所以,如果你有两个补丁需要有不同层次的细分,对TCS调用了不同补丁需要使用适当的细分控制,以确保修补程序之间的接口采用镶嵌的量相同。如果没有这种保护,差距和休息什么都应该是连续的补丁可能发生。

对TCS是可选的,如果没有TCS被设置缺省细分值都可以使用。

镶嵌原始发生器接受输入的补丁和细分它的基础上由TCS计算或作为默认值。

镶嵌评估着色器(TES)主罚细分的补丁,并计算顶点值,每个生成的顶点。

补丁

细分阶段的补丁操作,一个原始类型记为常数GL_PATCHES。补丁原语是一种通用原语,其中每Ñ顶点是一个新的补丁原始。每个色块的顶点的数目可以使用应用程序级被定义为:

void glPatchParameteri​(GLenum pname​​, GLint value​​);


与GL_PATCH_VERTICES作为靶和一个值,它是具有上半开区间[1,GL_MAX_PATCH_VERTICES)。补丁顶点的最大数目是实现相关的,但绝不会低于32。

曲面细分控制着色器

主要文章:曲面细分控制着色器

镶嵌的第一步是细分控制着色器(TCS)的可选调用。TCS的有两个工作:

· 确定镶嵌的是一种原始的应有之金额。

· 执行对输入补丁数据的任何特殊的转换。

该TCS可以改变一个补丁的大小,添加每个补丁更多的顶点或提供更少。然而,TCS不能丢弃补丁(直接,它可以这样做间接),也不能写多个补丁。因此,对于由应用程序提供的每个补丁,一个修补程序将提供给下一个细分阶段。

对TCS是可选的。如果没有TCS是活跃在当前程序或程序的管道,那么这个补丁的数据是直接从通过顶点着色器调用的镶嵌原语生成的一步。镶嵌在这种情况下完成的量是从设置到上下文中的默认值。这些由以下函数定义:

void glPatchParameterfv​(GLenum pname​​, const GLfloat *values​​);


当pname的是GL_PATCH_DEFAULT_OUTER_LEVEL,values​为浮点类型的四元数组。当pname的是GL_PATCH_DEFAULT_INNER_LEVEL,values​是浮点数定义两个内部镶嵌水平的2个元素的数组。

这些默认值对应于TCS每个补丁输出变量gl_TessLevelOuter [4]和gl_TessLevelInner [2] 。

原始的Tessellation生成

原语生成一个固定功能阶段负责创建一组从输入接插新的原语。只执行这个阶段,如果一个细分评估着色器(TES)是活跃在当前程序或程序的管道。原代受以下因素影响:

· 镶嵌层,由TCS或默认值提供任一,如上所述。

· 该镶嵌化顶点的间隔,通过随后的TES阶段的定义。它可以equal_spacing,fractional_even_spacing,或fractional_odd_spacing。

· 通过随后的TES这可能是一个定义的输入原始类型的三角形,四边形或等值线。工商业污水附加费也可以通过提供强制镶嵌的产生,一系列的点,而不是三角形或线point_mode原始。

· 通过随后的TES,其可以是所定义的原语生成顺序顺时针或逆时针。

摘要补丁

请注意,该原语生成不会受到对TCS的用户定义的输出(或顶点着色器,如果没有TCS处于激活状态)时,TCS的输出贴片尺寸,或除了细分级别任何每补丁TCS输出。网格化阶段的原始产生部分是完全盲目的实际顶点坐标和其他补丁数据。

原语生成系统的目的是为了确定有多少个顶点来产生,其中,为了生成它们,以及什么样的基元构建了出来的。实际的每个顶点的数据,这些顶点,例如位置,颜色,等等,是要由TES生成的,基于由基元信号发生器提供的信息。

因为这种二分法的,原始的发电机运行在什么可能被认为是“抽象的补丁”。它不看从TCS输出的补丁,它认为只有在镶嵌一个抽象的方形,三角形,或“等值线”块方面。

根据不同的抽象贴片型,原始生成的计算结果不同数目的细分级别,并且采用不同的细分算法。每个生成的顶点有一个规范化的位置(即坐标上的范围是[0,1])的抽象色块内。这个位置有两个或三个组成部分,这取决于补丁的类型。的坐标是通过内置的提供到TES 在VEC3 gl_TessCoord输入。

曲面细分级别

镶嵌的是做了抽象的贴片式量由内层和外层镶嵌级别定义。这些,如前所述,要么由TCS或通过指定context参数glPatchParameter。他们是一个4向量浮点数定义“外镶嵌水平”和彩车定义的2 -矢量“内镶嵌的水平。”

具体的解释取决于所使用的抽象贴片型,但总的想法是这样的。在大多数情况下,每个镶嵌级别定义了多少段的边缘被细化成;这样的4镶嵌级别表示的边缘将成为4边(2顶点成为5)。“外部”的细分级别定义细分为原始的外边缘。这使得它可以为两​​个或两个以上的补丁才能正常连接,同时还具有补丁中的不同细分层次。内侧镶嵌水平的抽象补丁内镶嵌的数量。

不是所有的抽象补丁使用值在外部/内部镶嵌级别的数据相同。例如,三角形只使用一个内部级和3级外的水平。其余的将被忽略。

该补丁可以如所使用的抽象接插型任何外镶嵌级别为0或更少被丢弃。它也可以,如果它是一个浮点NaN的丢弃。被丢弃的补丁没有得到细分的,并没有TES调用它。很简单,就是由系统吞噬,就好像它从来没有人。

这使得TCS以通过传递0为有关外镶嵌级别有效地剔除补丁。

以这种方式指定的镶嵌水平不直接使用。它们经过一个夹紧过程,以产生用于镶嵌的原始有效细分级别。这个过程依赖于工商业污水附加费的间距参数。

在下面的讨论中,最大允许的最大镶嵌级别,由定义GL_MAX_TESS_GEN_LEVEL。它必须至少为64,所以你有一些房间一起玩。

的间距会影响有效镶嵌级别如下:

equal_spacing

每个细分级别分别夹在闭区间[1,最大值 ]。然后,它被四舍五入到最接近的整数,得到一个有效的镶嵌级别。

fractional_even_spacing

每个细分级别分别夹在闭区间[2,最大 ]。然后,它被四舍五入到最接近的偶数整数,得到一个有效的镶嵌级别。

fractional_odd_spacing

每个细分级别分别夹在闭区间[1,最大值 - 1]。然后,它被四舍五入到最接近的奇数整数,得到一个有效的镶嵌级别。

边缘镶嵌间距

在大约镶嵌抽象的补丁即将举行的讨论不同点,将会有说镶嵌一些原始的边缘陈述。这意味着,根据一些镶嵌级别细分成一系列的段。这些段的总长度是原来的线段的长度。然而,各个段的长度取决于附加费规定的间距参数。

给定一个有效的细分级,记为Ñ,它适用于该边缘的顶点被细化的边缘Ñ被定义为:

equal_spacing

边缘被分成Ñ段。所有部门都享 ​​有平等的长度。

fractional_even_spacing,fractional_odd_spacing

如果Ñ是1,那么没有细分发生。否则,边 ​​缘会被分成Ñ -相同长度的2段。也将有2个链段具有长度彼此相等,但不一定在第一组。这2段的长度,相对于其他人,将是Ñ - f,其中f是夹紧后,但被围捕前的有效细分的电平值。

当Ñ == f,2段的长度将等于其他段的长度。由于Ñ - f接近2.0时,2段的相对长度接近0.0。

2短段的确切位置没有被定义,但它们应该被对称地放置,对细分边缘的相对侧。此外,该位置必须是不变的相同的f值(从而使镶嵌的边缘一起工作)。

分数间隔模式的目的是为了有更平滑,更稳定的插值细分为水平的变化。这如果镶嵌等级是根据相机或某物的距离,最好使用。

镶嵌原语

三角形

三角形镶嵌的抽象补丁是一个三角形,自然。仅在第3外的镶嵌水平被使用,并且仅在第一内镶嵌级别被使用。

产生并传送到TES每个顶点将提供重心坐标作为gl_TessCoord输入。这定义了这个顶点所在的抽象三角形内。与此配合,它可以从3个顶点乘以任何顶点属性来计算从细分单元的适当的值。

四边形

四抽象补丁是一个矩形,自然。所有的4和外2内的镶嵌级别使用。

产生并传送到TES每个顶点将被提供的归一化的2D坐标作为gl_TessCoord输入,较抽象补丁内的顶点的位置。

等值线





等值线的抽象补丁是一个矩形,奇怪。仅在第2外的镶嵌水平使用;没有内部细分级别被使用。

矩形抽象的等值线贴片代表一系列水平线,如右图所示。第一外镶嵌级别定义多少行是在补丁,第二个定义了多少段线分成。所以,如果你想镶嵌一行,你应该通过1 gl_TessLevelOuter [0] 。但是,如果你需要更多的线镶嵌比可以在一个单一的外部电平值来完成,工商业污水附加费完全有能力拼接多个单独的行在一起。请记住:抽象补丁是抽象的,无论它想要的工商业污水附加费可以定位的顶点。

产生并传送到TES每个顶点将被提供的归一化的2D坐标作为gl_TessCoord输入。该ý组件指定哪些行(归一化到半开区间[0,1)),正在产生。在x组件定义多远沿着这条线这个顶点应生成。

示例






等值线与苔丝水平(4,3)

等值线与苔丝水平(6,2)

镶嵌评估着色器

主要文章:镶嵌评估着色器

该曲面细分评价着色器(TES)是负责采取由原始发生器产生的抽象的坐标,以及来自TCS的输出(或顶点着色器,如果不使用TCS),并利用它们来计算顶点的实际值。这是你的代码,你实际使用来计算新的位置/正常/ texcoords /等算法。工商业污水附加费是镶嵌的强制部分,如果不存在,则镶嵌不会发生。

工商业污水附加费,而不是像一个顶点着色器,在每次调用运行在细分的补丁中一个独特的顶点(虽然,与顶点着色器,该系统可致电TES不止一次同一个顶点,所以它应该是确定的)。此外,工商业污水附加费不能剔除顶点。

示例

分类

· OpenGL着色语言

· 顶点处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: