Фрагментные шейдеры: выходные переменные - PullRequest
10 голосов
/ 14 ноября 2009

Чтение спецификации GLSL 1.40:

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

out vec4 FragmentColor; без света;

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

Ответы [ 3 ]

17 голосов
/ 26 июля 2011

Глобальная выходная переменная 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

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

4 голосов
/ 25 февраля 2011

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

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

0 голосов
/ 16 ноября 2009

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

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;
}
...