Передача данных через шейдеры

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

//vertex shaders
out VS_OUT { ... } vs_out;

Чем я написал этот код в шейдере управления тесселяцией:

in VS_OUT { ... } tc_in; 
out TC_OUT { ... } tc_out;

Итак, шейдер управления тесселяцией вызывается один раз для каждой вершины. Означает ли это, что tc_in должен быть не массивом, а одной переменной. Я не совсем уверен в этом из-за подлого gl_InvocationID.

Тогда все становится сложным. Оценка тесселяции шейдером. Что-то подсказывает мне, что оценочный шейдер должен принимать интерфейсный блок как массив.

in TC_OUT { ... } te_in[];
out TE_OUT { ...  } te_out[];

Переход к геометрии шейдера. Геометрический шейдер занимает несколько вершин, поэтому, безусловно, массив интерфейсных блоков.

in TE_OUT  { ... } gs_in[];
out vec3 random_variable;
...
random_variable = gs_in[whatever_index];

Кажется законным для меня, но данные не пришли к фрагменту шейдера.

Буду признателен за любые советы.

1 ответ

Решение

Управляющие шейдеры тесселяции принимают вершины патча как-то модифицируя их, поэтому их ввод и вывод

in VS_OUT { ... } tc_in[]; 
out TC_OUT { ... } tc_out[];

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

Шейдеры оценки тесселяции берут эти измененные вершины и выводят одну вершину за вызов, таким образом, мы имеем

in TC_OUT { ... } te_in[];
out TE_OUT { ...  } te_out;

Геометрические шейдеры принимают несколько вершин и могут выводить различное количество вершин, но они построены явно с использованием EmitVertex а также EmitPrimitive, поэтому есть только один выходной элемент, который должен быть заполнен перед каждым вызовом EmitVertex:

in TE_OUT { ... } gs_in[];
out GS_OUT { ... } gs_out;

Но не забудьте установить glPosition в вашем геометрическом шейдере, иначе OpenGL не будет знать, где разместить ваши вершины.

Интерполированные значения gs_out затем передаются фрагментному шейдеру.

Другие вопросы по тегам