代码之家  ›  专栏  ›  技术社区  ›  Makogan

如果几何体着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

  •  3
  • Makogan  · 技术社区  · 8 年前

    在添加几何体着色器之前,我在顶点着色器中声明了一个变量:

    out vec3 normal; 
    

    片段着色器接收为:

    in vec3 normal; 
    

    但是,如果我向程序中添加几何体着色器,链接器会告诉我法线尚未声明为前一阶段的输出。但我不知道如何在几何体着色器中接收或发送输出。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Rabbid76    8 年前

    verrtex着色器ar输入到几何体着色器的输出和geoemtry着色器的输出都是片段着色器的输入。
    几何体着色器的I输入将是基本体顶点计数长度的数组。(参见 Geometry Shader - Inputs )。

    这意味着您必须在几何体着色器中声明输入数组和输出:

    in  vec3 normal[];
    out vec3 geo_normal;
    

    将输入传递到输出:

    geo_normal = normal[i];
    EmitVertex();
    

    在片段着色器中声明输入:

    in vec3 geo_normal;
    



    一种选择是使用 Layout Qualifiers

    几何体着色器:

    in vec3 normal[]; // <---- array
    
    out layout(location=1) vec3 geo_normal;  
    

    geo\u normal=正常[i];
    EmitVertex();
    

    片段着色器:

    in layout(location=1) vec3 normal; // link by layout location 1 and not by name 
    



    另一种选择是使用 Interface Blocks :

    顶点着色器:

    out TData
    {
        vec3 normal;
    } outData;
    

    outData.normal = .....;
    

    几何体着色器:

    in TData
    {
        vec3 normal;
    } inData[]; // <---- array
    
    out TData
    {
        vec3 normal;
    } outData;
    

    outData.normal = inData.normal[i];
    EmitVertex();
    

    片段着色器:

    in TData
    {
        vec3 normal;
    } inData;
    

    ..... = inData.normal;