Ошибка glsl: & quot; v_color & quot; не объявляется как выход из предыдущего этапа при попытке рендеринга с помощью шейдеров тесселяции

Я хочу, чтобы мой рендерер мог использовать шейдеры тесселяции, но когда дело доходит до запуска, отладчик говорит

%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

Решение

Каждый этап шейдера передает выходной сигнал на вход следующего этапа. За вершинным шейдером следует контрольный шейдер тесселяции, за которым следует шейдер оценки тесселяции и, наконец, фрагментный шейдер (если геометрический шейдер отсутствует).

Если у вас есть тесселяционный шейдер и вы хотите передать атрибут из вершинного шейдера во фрагментный шейдер, то вы должны передать атрибут через все стадии шейдера:

например.:

Вершинный шейдер:

#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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]