为镶嵌控制着色器 Khronos的wiki指出为什么我们必须分别指定镶嵌着色器的输入和输出补丁大小?
输出贴片尺寸不必匹配输入贴片尺寸。
这是为什么?为什么当控制着色器能够在原生代获得补丁之前改变输入补丁大小时,我们必须指定输入补丁大小?
更新
以下说明是否正确?
输入补丁(至TCS)大小由glPatchParameter(GL_PATCH_VERTICES, X)
设置。这具有这样的结果,即in
属性阵列的长度为X.
TCS:
in vec4 vs_tc_position[]; // This has a length of X
的输出接插大小由layout (vertices = Y) out;
的TCS定义。这意味着出属性阵列的长度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
的长度输出补丁的顶点的数量无关的镶嵌原语生成(TPG),因为它只能看到一个抽象补丁。抽象补丁的顶点数量由TES layout (TYPE) in;
定义。
的TES被称为对于每个新顶点,其导致从抽象补丁由于由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使用quad作为抽象补丁和细分。然后在每个新顶点上调用TES并从TCS中插入5个输出顶点的属性,抽象补丁(以某种方式)用gl_TessCoord
计算新顶点的属性。
谢谢。我不知道TCS是可选的。请检查**更新**来回答我的问题,以进一步澄清此问题。 – Henkk
@NicolBolas快速后续问题 - 使用原始重启功能可以指定输入补丁大小吗?根据https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawElements.xhtml,'glMultiDrawElements'支持'GL_PATCHES',这使我认为原始重启应该也可以工作... – Ailurus
@ Ailurus:多重绘制功能与原始重启的东西无关。原始重启也不关心补丁类型是什么;它会起作用。但它也将*无用*。原始重新启动对于三角形条/风扇和线条/循环很有用。修补程序总是*个人,如三角形列表/行列表/点。因此,如果您想“重新启动”修补程序原语......只需向列表中添加X个以上的索引,其中X是修补程序大小。 –