Фрагментные шейдеры: выходные переменные

Считывание спецификации GLSL 1.40:

Выходы фрагментов могут быть только float, векторы с плавающей запятой, подписанные или целые числа без знака или целые векторы, или массивов любого из них. Матрицы и структуры не могут быть выведены. Фрагмент выходы объявляются как в следующие примеры:

out vec4 FragmentColor; out uint Luminosity;

Цвет фрагмента определяется написанием gl_FragColor... это правильно? Кто-то может очистить мои представления об этих результатах? Могу ли я написать только "FragmentColor" примера для определения цвета фрагмента? Могу ли я прочитать их (например, "Светимость" )?

Ответ 1

В вашем примере есть 2 выхода. Они имеют соответствующие слоты FBO, связанные после соединения программы GLSL. Вы можете перенаправить их с помощью glBindFragDataLocation.

Как только вы активируете шейдер и связанный FBO, все зависит от маски нити, установленной glDrawBuffers. Например, если вы передали GL_COLOR_ATTACHMENT0 и GL_COLOR_ATTACHMENT2 там, это означало бы, что выходной индекс 0 будет отправлен на вложение 0, а выходной индекс 1 перейдет к вложению цвета 2.

Ответ 2

Глобальная выходная переменная gl_FragColor устарела после версии GLSL 120. Теперь вы должны дать ему имя и тип самостоятельно, как в вашем примере. Что касается нескольких выходов, эта ссылка дает вам информацию о сопоставлении: http://www.opengl.org/wiki/GLSL_Objects#Program_linking

(И я нашел эту ссылку по адресу: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999)

Надеюсь, это поможет!: D

по электронной почте Ой! Я вижу, что кварк дал соответствующую информацию. Во всяком случае, может быть, вы тоже что-то внесли из моего текста.

Ответ 3

Я хочу привести несколько примеров:

void add(in float a, in float b, out float c)
{
    //you can not use c here. only set value
    //changing values of a and b does not change anything.
    c = a + b;
}

void getColor(out float r, out float g, out float b)
{
   //you can not use r, g, b here. only set value
   r = gl_FragColor.r;
   g = gl_FragColor.g;
   b = gl_FragColor.b;
}

void amplify(inout vec4 pixelColor, in value)
{
   //inout is like a reference
   pixelColor = pixelColor * value;
}