【问题标题】:Passing data through shaders通过着色器传递数据
【发布时间】:2017-07-04 18:46:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: opengl glsl shader opengl-4 tessellation


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!你帮了大忙!
    • 很高兴能提供帮助。如果你想要一些例子,当我第一次使用曲面细分着色器时,this article 帮助我理解了概念和实现。
    猜你喜欢
    • 2021-12-20
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多