GLSL alphablend?
gamedevfor | Постоялец | www | 7 ноя. 2017 | 23:52 | #0 |
---|
Нужно фрагментным шейдером вывести текстуру c альфа каналом во фреймбуфер.
Делаю так:
Текстура полностью вся исчезает (при том что прозрачность я задал только для маленького кусочка текстуры).
Если правильно понял то учитывается альфа канал из фреймбуфера, но у меня альфа канал для текстуры вычисляется в шейдере(!!!).
Как быть в таком случае?
Делаю так:
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
В доках говорят что:
New color in framebuffer =
current alpha in framebuffer * current color in framebuffer +
(1 - current alpha in framebuffer) * shader's output color
current alpha in framebuffer * current color in framebuffer +
(1 - current alpha in framebuffer) * shader's output color
Если правильно понял то учитывается альфа канал из фреймбуфера, но у меня альфа канал для текстуры вычисляется в шейдере(!!!).
Как быть в таком случае?
Misanthrope | Забанен | www | 8 ноя. 2017 | 0:00 | #1 |
---|
gamedevfor
> альфа канал для текстуры вычисляется в шейдере(!!!)
сам то понял что сказал ?
> альфа канал для текстуры вычисляется в шейдере(!!!)
сам то понял что сказал ?
gamedevfor | Постоялец | www | 8 ноя. 2017 | 0:02 | #2 |
---|
Misanthrope
А что не понятного?
P.S. В шейдер передается sampler2D и там вычисляется каждому текселю альфа-канал.
А что не понятного?
P.S. В шейдер передается sampler2D и там вычисляется каждому текселю альфа-канал.
Правка: 8 ноя. 2017 0:15
barnes | Постоялец | www | 8 ноя. 2017 | 1:00 | #3 |
---|
кхм.. а что за такой интересный у вас блендинг? Я пива выпил, но до такого чета не догоняю. Может травы надо ?
gamedevfor | Постоялец | www | 8 ноя. 2017 | 2:44 | #5 |
---|
glasm
Заработало, что то было не правильно.
Заработало, что то было не правильно.
Тогда другой вопрос: Как сделать чтобы на фрейбуффер передавался альфа-канал из текстуры но без смешивания цветов? Достаточно для этого выключить GL_BLEND?
PA3UJIb | Постоялец | www | 8 ноя. 2017 | 5:00 | #6 |
---|
gamedevfor
Это по умолчанию так.
Общее выражение для блендинга:
где factor1 и factor2 задаются как раз таки с помощью функции glBlendFunc ( f1, f2 ). Так что, если надо, чтобы бралась альфа от приходящего цвета, то смени соответственно второй множитель.
Почти то же самое, но только по-отдельности. Есть функция glBlendFuncSeparate ( f1_rgb, f2_rgb, f1_alpha, f2_alpha ) - ей можно задать множители для RGB и альфа составляющих. Чтобы приходящий цвет RGB не влезал, ставишь f2_rgb = GL_ZERO.
В доках говорят что:
Это по умолчанию так.
Общее выражение для блендинга:
result = src_color * factor1 + dest_color * factor2;
Как сделать чтобы на фрейбуффер передавался альфа-канал из текстуры но без смешивания цветов? Достаточно для этого выключить GL_BLEND?
Почти то же самое, но только по-отдельности. Есть функция glBlendFuncSeparate ( f1_rgb, f2_rgb, f1_alpha, f2_alpha ) - ей можно задать множители для RGB и альфа составляющих. Чтобы приходящий цвет RGB не влезал, ставишь f2_rgb = GL_ZERO.
gamedevfor | Постоялец | www | 8 ноя. 2017 | 19:21 | #7 |
---|
PA3UJIb
> Чтобы приходящий цвет RGB не влезал, ставишь f2_rgb = GL_ZERO.
> Чтобы приходящий цвет RGB не влезал, ставишь f2_rgb = GL_ZERO.
Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере:
//source //dest //result texture.r -> framebuffer.r -> texture.r; texture.g -> framebuffer.g -> texture.g; texture.b -> framebuffer.b -> texture.b; texture.a -> framebuffer.a -> texture.a;
PA3UJIb | Постоялец | www | 8 ноя. 2017 | 19:34 | #8 |
---|
gamedevfor
А. Ну, тогда выключай блендинг и будет тебе счастье.
Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере
А. Ну, тогда выключай блендинг и будет тебе счастье.
Suslik | Модератор | www | 9 ноя. 2017 | 6:54 | #9 |
---|
gamedevfor
> Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере:
glBlendFunc(GL_ONE, GL_ZERO) — результат будет тот же, что и при glDisable(GL_BLEND).
> Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере:
glBlendFunc(GL_ONE, GL_ZERO) — результат будет тот же, что и при glDisable(GL_BLEND).
gamedevfor | Постоялец | www | 9 ноя. 2017 | 15:04 | #10 |
---|
Suslik
Спасибо, думаю так даже лучше.
Спасибо, думаю так даже лучше.
bool | Участник | www | 9 ноя. 2017 | 17:07 | #11 |
---|
gamedevfor
а чем лучше-то? думаешь, лучше делать color= src * 1 + dst * 0, чем color = src?
а чем лучше-то? думаешь, лучше делать color= src * 1 + dst * 0, чем color = src?
Правка: 9 ноя. 2017 17:08
gamedevfor | Постоялец | www | 9 ноя. 2017 | 21:18 | #12 |
---|
bool
Дергать очень часто glEnable(GL_BLEND); / glDisable(GL_BLEND); может быть дорого или нет?
Дергать очень часто glEnable(GL_BLEND); / glDisable(GL_BLEND); может быть дорого или нет?
Suslik | Модератор | www | 10 ноя. 2017 | 1:52 | #13 |
---|
gamedevfor
сам-то как думаешь, оставляли бы их в стандарте, если бы в них не было смысла? чтобы смешать цвета по закону res = 1 * src + 0 * dst, шейдеру надо(теоретически) прочитать оба значения src и dst, а потом записать результат. при res = src, значение dst читать не надо, это, считай, в два раза уменьшает bandwidth.
сам-то как думаешь, оставляли бы их в стандарте, если бы в них не было смысла? чтобы смешать цвета по закону res = 1 * src + 0 * dst, шейдеру надо(теоретически) прочитать оба значения src и dst, а потом записать результат. при res = src, значение dst читать не надо, это, считай, в два раза уменьшает bandwidth.
Iron Man | Постоялец | www | 10 ноя. 2017 | 3:26 | #14 |
---|
gamedevfor
Вот проштудируй: http://www.mbsoftworks.sk/index.php?page=tutorials&series=1&tutorial=10
Вот проштудируй: http://www.mbsoftworks.sk/index.php?page=tutorials&series=1&tutorial=10
/ Форум / Программирование игр / Графика