当补丁大小>时,曲面细分如何知道面中哪些顶点属于一起? 4?

时间:2018-01-17 13:30:50

标签: opengl

不使用曲面细分着色器时,可以传递基本类型(GL_TRIANGLESGL_TRIANGLE_STRIP等),让OpenGL知道顶点流如何表示几何面。

使用曲面细分着色器,GL_PATCHES替换这些原始类型枚举。在处理大小为3或4的补丁,并将TES中的相应布局设置为三角形或四边形时,这在我的脑海中是有意义的。

但是如果我有一个16号的补丁(有些教程这样做),那么TPG如何知道3或4个顶点形成哪些面?我已多次读过顶点缓冲区中的顺序在使用GL_PATCHES时无关紧要,但肯定必须有一个点,其中一组特定的3个顶点被认为是一个三角形(传递到例如几何着色器)。这是怎么决定的?

2 个答案:

答案 0 :(得分:2)

Tessellation实际上并不使用您的补丁数据。曲面细分单元,即实际生成三角形(或线条)的管道部分,在abstract patch上运行。如果您的TES指定抽象补丁是四边形,则曲面细分器将在单位四边形上执行曲面细分。

您拥有多少个补丁顶点与此过程完全无关。

TES有点像顶点着色器;每个顶点调用一次。但不是GL_PATCHES原语中的每个顶点。它是 tessellated 原语的每个顶点。因此,如果你细分四边形,你的外层是(4,4,4,4),内层是(4,4),那将生成25个顶点。 TES将被多次调用(至少;对于相同的顶点可以多次调用它),并且将在抽象补丁中告知特定顶点的位置。

TES的工作是决定如何使用抽象补丁坐标和真实补丁顶点数据来生成渲染管道要使用的实际每顶点数据。例如,如果您要创建Bezier补丁,则会有16个补丁顶点。 TES的工作是采用抽象补丁坐标并使用双三次贝塞尔插值将补丁上的16个位置插入抽象补丁中的特定位置。这成为输出位置。可以类似地计算法线,纹理坐标和其他数据。

答案 1 :(得分:1)

简短的回答是:TPG(曲面细分生成器)根本不知道/关心补丁大小。

TPG仅关注曲面细分评估着色器(三角形,四边形,等值线)的指定输入布局以及控件着色器设置的曲面细分级别。它无权访问补丁本身,但仅根据此镶嵌中使用的类型和级别生成镶嵌坐标。

用户不是在曲面细分评估着色器中负责建立每个控制点参数之间的关系(从曲面细分控制着色器传递,由in/out捐赠,以某种方式类似于变化)和{{1} (来自TPG)。

请注意,每个控制点参数的数量和曲面细分坐标的数量不一定相同。

如需进一步阅读,以下文章可能有所帮助: Primitive Processing in Open GL,尤其是图8.1