Как передать информацию из вершинного шейдера во фрагментный шейдер, если активен геометрический шейдер?
Перед добавлением геометрического шейдера я объявил переменную в вершинном шейдере:
out vec3 normal;
Получать фрагментным шейдером как:
in vec3 normal;
Однако, если я добавлю геометрический шейдер в программу, компоновщик скажет мне, что normal не был объявлен как выходной файл из этапа prvious. Но я не уверен, как получить или отправить вывод в геометрический шейдер.
1 ответ
Выходные данные вершинного шейдера являются входными данными для геометрического шейдера, а выходные данные геодеметрического шейдера являются входными данными для фрагментного шейдера.
Входные данные для геометрического шейдера будут массивом длины вершин примитива. (См. Геометрический шейдер - Входы).
Это означает, что вы должны объявить входной массив и вывод в геометрическом шейдере:
in vec3 normal[];
out vec3 geo_normal;
Передайте вход на выход:
geo_normal = normal[i];
EmitVertex();
Объявите вход в шейдер фрагмента:
in vec3 geo_normal;
Можно было бы использовать квалификаторы макета
Геометрия шейдера:
in vec3 normal[]; // <---- array
out layout(location=1) vec3 geo_normal;
geo_normal = normal[i];
EmitVertex();
Фрагмент шейдера:
in layout(location=1) vec3 normal; // link by layout location 1 and not by name
Другой вариант будет использовать блоки интерфейса:
Вершинный шейдер:
out TData
{
vec3 normal;
} outData;
outData.normal = .....;
Геометрия шейдера:
in TData
{
vec3 normal;
} inData[]; // <---- array
out TData
{
vec3 normal;
} outData;
outData.normal = inData.normal[i];
EmitVertex();
Фрагмент шейдера:
in TData
{
vec3 normal;
} inData;
..... = inData.normal;