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

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

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

out vec4 FragmentColor; out uint Яркость;

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


person Luca    schedule 14.11.2009    source источник


Ответы (3)


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

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

person kvark    schedule 25.02.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

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

person Deorbit    schedule 25.07.2011

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

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;
}
person ufukgun    schedule 16.11.2009