glsl error: "v_color" not declared as an output from the previous stage while trying to render wtih tesselation shaders

glsl error: "v_color" not declared as an output from the previous stage while trying to render wtih tesselation shaders

我希望我的渲染器能够使用细分着色器,但是当涉及到 运行 时,调试器说

%s
Link info
---------
error: "v_color" not declared as an output from the previous stage

我不知道它到底是什么意思。

v_color 是 vec4 中的片段着色器,它来自顶点着色器,顶点着色器从 vbo 中获取这个值,如下所示:

#version 420 core                                                 

layout (location = 1) in vec4 a_color                             
out vec4 v_color;                                                 
void main(void)                                                   
{                                                                    
    gl_Position = //something;                          
    v_color = a_color;                                            
}  

#version 420 core                                                  

out vec4 color;                                                    
in vec4 v_color;                                                   

void main(void)                                                    
{                                                                  
    color = v_color;                                               
}         

顶点着色器从顶点属性指针获取 a_color。

为什么会 returns 错误?

每个着色器阶段将输出传递给下一阶段的输入。顶点着色器之后是曲面细分控制着色器,接着是曲面细分评估着色器,最后是片段着色器(如果没有几何着色器)。

如果你有一个曲面细分着色器并且你想将一个属性从顶点着色器传递到片段着色器,那么你必须通过所有着色器阶段传递该属性:

例如:

Vertex shader:

#version 420 core                                                 

layout (location = 1) in vec4 a_color                             
out vec4 v_color;                                                 

void main(void)                                                   
{                                                                    
   v_color = a_color;

   // .....                                            
}

Tessellation control shader:

#version 420 core    

layout(vertices=3) out; 

in  vec4 v_color[];
out vec4 tc_color[];

void main()
{
    tc_color[gl_InvocationID] = v_color[gl_InvocationID];

    // .....
}

Tessellation evaluation shader:

#version 420 core 

layout(triangles) in;

in  vec4 tc_color[];
out vec4 te_color;

void main()
{
    te_color = tc_color[0] * gl_TessCoord.x +
               tc_color[1] * gl_TessCoord.y +
               tc_color[2] * gl_TessCoord.z;

    // .....
}

Fragment shader:

#version 420 core                                                  

in  vec4 te_color;  
out vec4 color;                                                    

void main(void)                                                    
{                                                                  
    color = te_color;                                               
}