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