Эй @ Дэниел, вы можете передавать массивы в шейдеры, используя униформу. Мне нравится думать об униформе как о аргументах или входных данных для шейдера.
С https://www.khronos.org/opengl/wiki/Uniform_(GLSL):
Эти [униформы] действуют как параметры, которые пользователь шейдерной программы может передать этой программе.
struct Thingy
{
vec4 an_array[3];
int foo;
};
layout(location = 2) uniform Thingy some_thingies[6];
Некоторые люди предпочитают передавать массивы в виде текстур, где значения r, g, b представляют некоторые значения, которые вам нужны в вашем шейдере.
uniform sampler2D myTexture;
Для получения результата; как правило, ваш шейдер будет выводить в кадровый буфер по умолчанию.
По умолчанию Framebuffer - это Framebuffer, с помощью которого создается OpenGL. Он создается вместе с контекстом OpenGL. Как и объекты Framebuffer, кадровый буфер по умолчанию представляет собой серию изображений. В отличие от FBO, одно из этих изображений обычно представляет то, что вы на самом деле видите на некоторой части экрана.
Стандартный кадровый буфер создается во время создания контекста OpenGL.
Насколько я знаю, фрагментные шейдеры способны выводить только в буфер кадров, поэтому, если вам нужно получить какой-то массив, вам нужно будет вывести его в буфер кадров, а затем извлечь данные из буфера кадров. .
Определяемые пользователем выходные данные фрагментного шейдера представляют собой серию
"цвета". Эти значения цвета направлены в конкретные буферы на основе
в состоянии glDrawBuffers. Они называются «фрагментными цветами», хотя
Вы можете обращаться с ними как с любыми произвольными данными.
Вы также можете выводить в более чем один буфер в зависимости от того, как вы настроили свой кадровый буфер, см.
Отображение между цветами фрагмента и фактическими буферами в Framebuffer определяется glDrawBuffers, который является частью состояния framebuffer.
Например, если мы настроим наши буферы рисования следующим образом:
const GLenum buffers [] = {GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT2,
GL_NONE, GL_COLOR_ATTACHMENT0}; glDrawBuffers (4, буферы);
К сожалению, хотя фрагментные шейдеры работают только с доступными им данными по каждому пикселю, и вы не можете контролировать, какой это пиксель. Чтобы справиться с этим, люди часто используют технику, называемую отложенным затенением, когда необходимая информация о пикселях передается в качестве входных данных текстуры фрагментного шейдера (обычно используется для постобработки).
Надеюсь, этот ответ не слишком длинный и сложный для понимания, к сожалению, вернуть массив с помощью шейдера немного сложнее, чем вы ожидаете.
В качестве альтернативы, OpenCL может быть более подходящим для того, что вы пытаетесь сделать, хотя у меня нет опыта в этом.