GLSL 错误:尝试使用细分着色器进行渲染时,"v_color"未声明为上一阶段的输出



我希望我的渲染器能够使用镶嵌着色器,但当它运行时,调试器会说

%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;                                               
}         

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

为什么返回错误?

每个着色器阶段都将输出传递给下一阶段的输入。顶点着色器之后是镶嵌控制着色器,然后是镶嵌评估着色器,最后是片段着色器(如果没有几何体着色器(。

如果有镶嵌着色器,并且要将属性从顶点sahder传递到片段着色器,则必须将该属性传递到所有着色器阶段:

例如:

顶点着色器:

#version 420 core                                                 
layout (location = 1) in vec4 a_color                             
out vec4 v_color;                                                 
void main(void)                                                   
{                                                                    
v_color = a_color;
// .....                                            
}

细分控制着色器:

#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];
// .....
}

细分评估着色器:

#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;
// .....
}

片段着色器:

#version 420 core                                                  
in  vec4 te_color;  
out vec4 color;                                                    
void main(void)                                                    
{                                                                  
color = te_color;                                               
}  

最新更新