0

使用顶点时,如何通过着色器传递数据,苔丝。控制,苔丝。评估、几何和片段着色器。我试过以这种方式使用接口块。

//vertex shaders
out VS_OUT { ... } vs_out;

比我在镶嵌控制着色器中编写的代码:

in VS_OUT { ... } tc_in; 
out TC_OUT { ... } tc_out;

因此,镶嵌控制着色器为每个顶点调用一次。这是否意味着 tc_in 必须不是数组而是单个变量。由于偷偷摸摸的 gl_InvocationID,我不太确定。

然后事情变得艰难。细分评估着色器。有些东西告诉我评估着色器应该将接口块作为数组。

in TC_OUT { ... } te_in[];
out TE_OUT { ...  } te_out[];

移动到几何着色器。几何着色器需要多个顶点,因此,绝对是数组接口块。

in TE_OUT  { ... } gs_in[];
out vec3 random_variable;
...
random_variable = gs_in[whatever_index];

对我来说似乎是合法的,但数据没有进入片段着色器。

我会很感激任何建议。

4

1 回答 1

2

镶嵌控制着色器将补丁的顶点作为以某种方式修改它们,因此它们的输入和输出是

in VS_OUT { ... } tc_in[]; 
out TC_OUT { ... } tc_out[];

为每个补丁顶点调用控制着色器(通过使用查看哪个gl_InvocationID),因此您通常不需要任何循环来实现它。

细分评估着色器采用这些修改后的顶点并在每次调用时输出一个顶点,因此我们有

in TC_OUT { ... } te_in[];
out TE_OUT { ...  } te_out;

几何着色器采用多个顶点并可能输出不同数量的顶点,但这些顶点是使用EmitVertexand显式构造的EmitPrimitive,因此在每次调用 之前只需填充一个输出元素EmitVertex

in TE_OUT { ... } gs_in[];
out GS_OUT { ... } gs_out;

但是不要忘记glPosition在你的几何着色器中设置,否则 OpenGL 将不知道在哪里放置你的顶点。

然后将 的插值gs_out传递给片段着色器。

于 2017-07-04T19:01:11.670 回答