通过着色器传递数据

Passing data through shaders

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

//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];

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

如有任何建议,我将不胜感激。

曲面细分控制着色器以某种方式修改补丁的顶点,因此它们的输入和输出是

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

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

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

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

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

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

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

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