通过着色器传递数据

时间:2017-07-04 18:46:23

标签: opengl glsl shader opengl-4 tessellation

当使用vertex,tess时,如何通过着色器传递数据。控制,tess。评估,几何和片段着色器。我尝试过这种方式使用接口块。

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

比我在曲面细分控制着色器中编写此代码:

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

因此,tesselation控件着色器为每个顶点调用一次。这是否意味着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];

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

我很感激任何建议。

1 个答案:

答案 0 :(得分:2)

细分控制着色器将修补程序的顶点视为以某种方式修改它们,因此它们的输入和输出是

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的插值传递给片段着色器。