当使用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];
对我来说似乎是合法的,但数据并没有成为片段着色器。
我很感激任何建议。
答案 0 :(得分:2)
细分控制着色器将修补程序的顶点视为以某种方式修改它们,因此它们的输入和输出是
in VS_OUT { ... } tc_in[];
out TC_OUT { ... } tc_out[];
为每个补丁顶点调用控件着色器(使用gl_InvocationID
查看哪一个),因此您通常不需要任何循环来实现它。
细分评估着色器采用这些修改过的顶点并在每次调用时输出单顶点,因此我们有
in TC_OUT { ... } te_in[];
out TE_OUT { ... } te_out;
几何着色器采用多个顶点并可能输出不同数量的顶点,但这些顶点是使用EmitVertex
和EmitPrimitive
显式构造的,因此在每次调用之前只需要填充一个输出元素EmitVertex
:
in TE_OUT { ... } gs_in[];
out GS_OUT { ... } gs_out;
但是不要忘记在几何着色器中设置glPosition
,否则OpenGL不知道在哪里放置顶点。
然后将gs_out
的插值传递给片段着色器。