镶嵌控制着色器的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。因此,in
TES 的属性数组的长度为 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
来自抽象补丁(以某种方式)的属性进行插值,以计算新顶点的属性。