2017-02-27 40 views
2

镶嵌控制着色器 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计算新顶点的属性。

回答

3

必须指定输入补丁大小,因为根本没有有TCS。

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

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

因此,TCS可以将单个输入顶点转化为4个输出顶点;这可能对像四边形镶嵌的东西有用。

+0

谢谢。我不知道TCS是可选的。请检查**更新**来回答我的问题,以进一步澄清此问题。 – Henkk

+0

@NicolBolas快速后续问题 - 使用原始重启功能可以指定输入补丁大小吗?根据https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawElements.xhtml,'glMultiDrawElements'支持'GL_PATCHES',这使我认为原始重启应该也可以工作... – Ailurus

+1

@ Ailurus:多重绘制功能与原始重启的东西无关。原始重启也不关心补丁类型是什么;它会起作用。但它也将*无用*。原始重新启动对于三角形条/风扇和线条/循环很有用。修补程序总是*个人,如三角形列表/行列表/点。因此,如果您想“重新启动”修补程序原语......只需向列表中添加X个以上的索引,其中X是修补程序大小。 –

相关问题