Фрагментные шейдеры:выходные переменные
Вопрос
Чтение спецификации 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;
}