У меня проблемы с передачей данных через мои шейдеры, в частности, шейдер 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[];
У меня вопрос, как правильно передать данные между каждым шейдером? Мол, это способ сделать это? (потому что это не работает для меня!)
Неограниченные массивы для ввода корректны для шейдера Geomtery (размер будет определяться типом ввода в классификаторе макета), но вывод не могу быть массивом.
Вы выводите вершины по одной, записывая значения во все выходные переменные, а затем вызывая EmitVertex (...)
, Любая выходная переменная, которая не записывается между вызовами EmitVertex (...)
будет неопределенным
#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 ();
}
}