Передача данных через шейдеры
Как можно передавать данные через шейдеры, при использовании вершины, тесс. контроль, тесс. оценочные, геометрические и фрагментные шейдеры. Я пытался использовать интерфейсный блок таким образом.
//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
затем передаются фрагментному шейдеру.