Я хочу, чтобы мой рендерер мог использовать шейдеры тесселяции, но когда дело доходит до запуска, отладчик говорит
%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 из указателя атрибута вершины.
Почему это возвращает ошибку?
Каждый этап шейдера передает выходной сигнал на вход следующего этапа. За вершинным шейдером следует контрольный шейдер тесселяции, за которым следует шейдер оценки тесселяции и, наконец, фрагментный шейдер (если геометрический шейдер отсутствует).
Если у вас есть тесселяционный шейдер и вы хотите передать атрибут из вершинного шейдера во фрагментный шейдер, то вы должны передать атрибут через все стадии шейдера:
например.:
#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;
}
Других решений пока нет …