Вопрос

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

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

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

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

Это было полезно?

Решение

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

После того, как вы активировали шейдер и привязали FBO, все зависит от маски рисования, установленной glDrawBuffers.Например, если вы прошли GL_COLOR_ATTACHMENT0 и GL_COLOR_ATTACHMENT2 там это будет означать, что выходной индекс 0 будет передан вложению 0, а выходной индекс 1 будет передан вложению цвета 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

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

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top