首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们必须分别指定镶嵌着色器的输入和输出补丁大小?

为什么我们必须分别指定镶嵌着色器的输入和输出补丁大小?
EN

Stack Overflow用户
提问于 2017-02-27 11:43:08
回答 1查看 878关注 0票数 3

用于镶嵌控制阴影的Khronos 维基指出:

输出修补程序大小不必与输入修补程序大小匹配。

为什么会这样呢?当控件着色器能够在原始生成获得修补程序之前更改输入补丁大小时,我们为什么要指定输入补丁的大小呢?

更新

下面的解释正确吗?

输入补丁( TCS)大小由glPatchParameter(GL_PATCH_VERTICES, X)设置。这会导致in属性数组的长度为X。

代码语言:javascript
复制
TCS:
in vec4 vs_tc_position[]; // This has a length of X

输出补丁大小由TCSs layout (vertices = Y) out;定义。这意味着out属性数组的长度为Y。

代码语言:javascript
复制
TCS:
out vec4 tc_te_position[]; // This has a length of Y

TCS称为Y乘,并将输出直接传递给TES。因此,TES的in属性数组的长度为Y。

代码语言:javascript
复制
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的所有顶点(更像控制点)插值属性。

示例

因此,以下情况可能是可能的。

代码语言:javascript
复制
glPatchParameteri(GL_PATCH_VERTICES, 1);

TCS每个补丁有一个顶点。

代码语言:javascript
复制
layout (vertices = 5) out;

TCS为输出补丁创建5个顶点。不知何故。

代码语言:javascript
复制
layout (quads) in;

TPG使用四角体作为抽象补丁并进行细分。然后,在每个新顶点上调用TES,并将TCS的5个输出顶点的属性与抽象补丁中的gl_TessCoord (以某种方式)进行插值,以计算新顶点的属性。

EN

回答 1

Stack Overflow用户

发布于 2017-02-27 15:26:55

必须指定输入修补程序的大小,因为根本不需要有TCS。

此外,请记住,输入修补程序大小用于解释用它呈现的顶点流。每个X点都是一个补丁,所以OpenGL需要知道使用什么X。即使使用TCS,OpenGL也需要有一个输入大小,才能知道要传递给TCS操作的顶点数。

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

因此,TCS可以将单个输入顶点转换为4个输出顶点;这对于像四角点这样的东西是有用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42484935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档