曲面细分控制着色器的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;
定义。这意味着 out 属性数组的长度为Y.
TCS:
out vec4 tc_te_position[]; // This has a length of Y
TCS 称为Y次,并将输出直接传递给TES。因此,TES的in
属性数组的长度为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。然后,TES可以根据抽象补丁中的gl_TessCoord
和来自TCS的所有顶点(更像是控制点)插入属性。
因此,以下情况是可能的。
glPatchParameteri(GL_PATCH_VERTICES, 1);
TCS每个补丁获得一个顶点。
layout (vertices = 5) out;
TCS为输出补丁创建5个顶点。不知。
layout (quads) in;
TPG使用四边形作为抽象补丁并细分。然后在每个新顶点上调用TES,并使用来自抽象补丁的gl_TessCoord
(以某种方式)从TCS插入5个输出顶点的属性,以计算新顶点的属性
答案 0 :(得分:3)
必须指定输入补丁大小,因为 根本没有TCS。
另外,请记住输入的补丁大小用于解释您渲染的顶点流。每个X顶点都是一个补丁,因此OpenGL需要知道要使用的X.即使使用TCS,OpenGL也需要有一个输入大小来知道要传递给TCS操作的顶点数。
至于输入和输出补丁大小可能不同的原因,那就是让TCS和用户自由地做任何他们想做的事情。 TCS能够随意添加,删除或修改数据,包括添加或删除整个值。
因此TCS可以将单个输入顶点转换为4个输出顶点;这对于像四边形镶嵌这样的东西很有用。