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

У меня проблемы с передачей данных через мои шейдеры, в частности, шейдер Geometry. Я никогда раньше не использовал Geometry Shader, поэтому у меня возникли небольшие проблемы с пониманием способа передачи данных.

По сути, до шейдера Geometry я передавал данные из вершинного шейдера во фрагмент, просто используя квалификаторы in / out. Как у меня было бы:

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

out vec3 worldNormal;
out vec3 worldView;

Фрагмент шейдера:

in vec3 ex_worldNorm;
in vec3 ex_worldView;

Так что, для геометрического шейдера, я должен был бы сделать что-то подобное для передачи данных?

in vec3 ex_worldNorm[];
in vec3 ex_worldView[];

out vec3 ex_worldNorm[];
out vec3 ex_worldNorm[];

У меня вопрос, как правильно передать данные между каждым шейдером? Мол, это способ сделать это? (потому что это не работает для меня!)

0

Решение

Неограниченные массивы для ввода корректны для шейдера Geomtery (размер будет определяться типом ввода в классификаторе макета), но вывод не могу быть массивом.

Вы выводите вершины по одной, записывая значения во все выходные переменные, а затем вызывая EmitVertex (...), Любая выходная переменная, которая не записывается между вызовами EmitVertex (...) будет неопределенным


Вот очень простой пример Geometry Shader, который делает то, что вы хотите:

#version 330layout (triangles) in; // This will automatically size your two arrays to 3, and also
//   defines the value of `gl_in.length ()`

in vec3 worldNormal [];
in vec3 worldView   [];

// ^^^ Names match up with Vertex Shader outputlayout (triangle_strip, max_vertices = 3) out;

out vec3 ex_worldNorm;
out vec3 ex_worldView;

// ^^^ Names match up with Fragment Shader inputvoid main (void)
{
// For each input vertex, spit one out
for (int i = 0; i < gl_in.length (); i++) {
ex_worldNorm = worldNormal [i];
ex_worldView = worldView   [i];
EmitVertex ();
}
}
1

Другие решения


По вопросам рекламы [email protected]