Как передать информацию из вершинного шейдера во фрагментный шейдер, если активен геометрический шейдер?

Перед добавлением геометрического шейдера я объявил переменную в вершинном шейдере:

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;
Другие вопросы по тегам