3

镶嵌控制着色器的Khronos wiki指出

输出补丁大小不必与输入补丁大小匹配。

这是为什么?当控制着色器能够在原始生成获得补丁之前更改输入补丁大小时,为什么我们必须指定输入补丁大小?

更新

下面的解释正确吗?

输入补丁(到 TCS)大小由glPatchParameter(GL_PATCH_VERTICES, X). 这导致in属性数组的长度为 X。

TCS:
in vec4 vs_tc_position[]; // This has a length of X

输出补丁大小由 TCS定义layout (vertices = Y) out;。这意味着输出属性数组的长度为 Y。

TCS:
out vec4 tc_te_position[]; // This has a length of Y

TCS 被调用 Y 次并将输出直接传递给 TES。因此,inTES 的属性数组的长度为 Y。

TES:
in vec4 tc_te_position[]; // This has a length of Y

输出补丁顶点的数量与 Tessellation Primitive Generation (TPG) 无关,因为它只看到一个抽象补丁。抽象补丁的顶点数由 TES 定义layout (TYPE) in;

由于TCS(当它存在时)或glPatchParameter(GL_PATCH_DEFAULT_{OUTER|INNER}_LEVEL). 然后,TES 可以根据gl_TessCoord来自抽象补丁的属性和来自 TCS 的所有顶点(更像控制点)对属性进行插值。

例子

因此,可能出现以下情况。

glPatchParameteri(GL_PATCH_VERTICES, 1);

TCS 每个补丁获得一个顶点。

layout (vertices = 5) out;

TCS 为输出补丁创建 5 个顶点。不知何故。

layout (quads) in;

TPG 使用四边形作为抽象补丁并进行细分。然后在每个新顶点上调用 TES,并将来自 TCS 的 5 个输出顶点的属性与gl_TessCoord来自抽象补丁(以某种方式)的属性进行插值,以计算新顶点的属性。

4

1 回答 1

3

必须指定输入补丁大小,因为您根本不需要TCS

另外,请记住,输入补丁大小用于解释您渲染的顶点流。每个 X 顶点都是一个补丁,因此 OpenGL 需要知道使用什么 X。即使使用 TCS,OpenGL 也需要有一个输入大小才能知道要传递给 TCS 操作的顶点数。

至于为什么输入和输出补丁大小可以不同,那是为了让 TCS 和用户自由地做任何他们想做的事情。TCS 能够根据需要添加、删除或修改数据,包括添加或删除整个值。

所以一个TCS可以把一个输入顶点变成4个输出顶点;这可能对四边形细分等有用。

于 2017-02-27T15:26:55.183 回答