我希望我的渲染器能够使用tesselation着色器,但是在运行时,调试器会说
%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。
为什么返回错误?
答案 0 :(得分:0)
每个着色器阶段将输出传递到下一个阶段的输入。顶点着色器之后是曲面细分控制着色器,其后是曲面细分评估着色器,最后是片段着色器(如果没有几何体着色器)。
如果您具有曲面细分着色器,并且想要将属性从顶点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];
// .....
}
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;
// .....
}
#version 420 core
in vec4 te_color;
out vec4 color;
void main(void)
{
color = te_color;
}