glsl 错误:在尝试使用镶嵌着色器渲染时,“v_color”未声明为前一阶段的输出

Posted

技术标签:

【中文标题】glsl 错误:在尝试使用镶嵌着色器渲染时,“v_color”未声明为前一阶段的输出【英文标题】:glsl error: "v_color" not declared as an output from the previous stage while trying to render wtih tesselation shaders 【发布时间】:2018-11-30 21:54:51 【问题描述】:

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

%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。

为什么会返回错误?

【问题讨论】:

【参考方案1】:

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

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

例如:

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;                                               
  

【讨论】:

我明白了。非常感谢 还有一个问题。现在它返回error: "te_color" not declared as input from previous stage @JarekBisnesu 所以out vec4 te_color; 可能在您的代码中的镶嵌评估着色器中丢失,或者您没有为其分配任何值? 不,它实际上是从您的示例中复制而来的。我检查了 5 次。 @JarekBisnesu 曲面细分评估着色器出现错误(+ 丢失)。我测试了代码,它现在对我有用。

以上是关于glsl 错误:在尝试使用镶嵌着色器渲染时,“v_color”未声明为前一阶段的输出的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/GLSL 颜色附件范围

在GLSL ES中的片段着色器上旋转纹理

GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

我的 GLSL 着色器程序链接正常,但是当我尝试使用它时出错——我该如何调试它?

带有片段着色器的 GLSL 仅渲染黑色 GL_POINTS

用于片段着色器的 OpenGL GLSL 绑定采样器