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”未声明为前一阶段的输出的主要内容,如果未能解决你的问题,请参考以下文章
GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO