Ошибка glsl: «v_color» не объявлен как выход из предыдущего этапа при попытке рендеринга с помощью шейдеров тесселяции - PullRequest
0 голосов
/ 01 декабря 2018

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

%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 Ответ

0 голосов
/ 01 декабря 2018

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

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

например:

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

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