用于镶嵌控制阴影的Khronos 维基指出:
输出修补程序大小不必与输入修补程序大小匹配。
为什么会这样呢?当控件着色器能够在原始生成获得修补程序之前更改输入补丁大小时,我们为什么要指定输入补丁的大小呢?
更新
下面的解释正确吗?
输入补丁( TCS)大小由glPatchParameter(GL_PATCH_VERTICES, X)设置。这会导致in属性数组的长度为X。
TCS:
in vec4 vs_tc_position[]; // This has a length of X输出补丁大小由TCSs layout (vertices = Y) out;定义。这意味着out属性数组的长度为Y。
TCS:
out vec4 tc_te_position[]; // This has a length of YTCS称为Y乘,并将输出直接传递给TES。因此,TES的in属性数组的长度为Y。
TES:
in vec4 tc_te_position[]; // This has a length of Y输出补丁顶点的数量与Tessellation原语生成(TPG)无关,因为它只看到一个抽象的补丁。抽象补丁的顶点数由TESs 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,并将TCS的5个输出顶点的属性与抽象补丁中的gl_TessCoord (以某种方式)进行插值,以计算新顶点的属性。
发布于 2017-02-27 15:26:55
必须指定输入修补程序的大小,因为根本不需要有TCS。
此外,请记住,输入修补程序大小用于解释用它呈现的顶点流。每个X点都是一个补丁,所以OpenGL需要知道使用什么X。即使使用TCS,OpenGL也需要有一个输入大小,才能知道要传递给TCS操作的顶点数。
至于为什么输入和输出补丁的大小可能不同,也就是给TCS和用户自由去做他们想做的事情。TCS可以任意添加、删除或修改数据,包括添加或删除整个值。
因此,TCS可以将单个输入顶点转换为4个输出顶点;这对于像四角点这样的东西是有用的。
https://stackoverflow.com/questions/42484935
复制相似问题