Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / GLSL alphablend?

GLSL alphablend?

Поделиться

Страницы: 1 2 3 Следующая

gamedevforПользовательwww7 ноя. 201723: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

Если правильно понял то учитывается альфа канал из фреймбуфера, но у меня альфа канал для текстуры вычисляется в шейдере(!!!).
Как быть в таком случае?

MisanthropeПостоялецwww8 ноя. 20170:00#1
gamedevfor
> альфа канал для текстуры вычисляется в шейдере(!!!)
сам то понял что сказал ?
gamedevforПользовательwww8 ноя. 20170:02#2
Misanthrope
А что не понятного?
P.S. В шейдер передается sampler2D и там вычисляется каждому текселю альфа-канал.

Правка: 8 ноя. 2017 0:15

barnesПостоялецwww8 ноя. 20171:00#3
кхм.. а что за такой интересный у вас блендинг? Я пива выпил, но до такого чета не догоняю. Может травы надо ?
barnesПостоялецwww8 ноя. 20171:04#4
а... человеку оказывается обычный альфа бленд нужен.
glasmПользовательwww8 ноя. 20171:51#5
gamedevfor
gl_FragColor = vec4(.5,.5,.5,.5);
тоже не видно ?
gamedevforПользовательwww8 ноя. 20172:44#6
glasm
Заработало, что то было не правильно.

Тогда другой вопрос: Как сделать чтобы на фрейбуффер передавался альфа-канал из текстуры но без смешивания цветов? Достаточно для этого выключить GL_BLEND?

PA3UJIbПостоялецwww8 ноя. 20175:00#7
gamedevfor
В доках говорят что:

Это по умолчанию так.
Общее выражение для блендинга:
result = src_color * factor1 + dest_color * factor2;
где factor1 и factor2 задаются как раз таки с помощью функции glBlendFunc ( f1, f2 ). Так что, если надо, чтобы бралась альфа от приходящего цвета, то смени соответственно второй множитель.
Как сделать чтобы на фрейбуффер передавался альфа-канал из текстуры но без смешивания цветов? Достаточно для этого выключить GL_BLEND?

Почти то же самое, но только по-отдельности. Есть функция glBlendFuncSeparate ( f1_rgb, f2_rgb, f1_alpha, f2_alpha ) - ей можно задать множители для RGB и альфа составляющих. Чтобы приходящий цвет RGB не влезал, ставишь f2_rgb = GL_ZERO.
gamedevforПользовательwww8 ноя. 201719:21#8
PA3UJIb
> Чтобы приходящий цвет 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Постоялецwww8 ноя. 201719:34#9
gamedevfor
Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере

А. Ну, тогда выключай блендинг и будет тебе счастье.
SuslikМодераторwww9 ноя. 20176:54#10
gamedevfor
> Мне нужно чтобы текстура из шейдера делала overwrite тому что во фреймбуфере:
glBlendFunc(GL_ONE, GL_ZERO) — результат будет тот же, что и при glDisable(GL_BLEND).
gamedevforПользовательwww9 ноя. 201715:04#11
Suslik
Спасибо, думаю так даже лучше.
boolПостоялецwww9 ноя. 201717:07#12
gamedevfor
а чем лучше-то? думаешь, лучше делать color= src * 1 + dst * 0, чем color = src?

Правка: 9 ноя. 2017 17:08

gamedevforПользовательwww9 ноя. 201721:18#13
bool
Дергать очень часто glEnable(GL_BLEND); /  glDisable(GL_BLEND); может быть дорого или нет?
SuslikМодераторwww10 ноя. 20171:52#14
gamedevfor
сам-то как думаешь, оставляли бы их в стандарте, если бы в них не было смысла? чтобы смешать цвета по закону res = 1 * src + 0 * dst, шейдеру надо(теоретически) прочитать оба значения src и dst, а потом записать результат. при res = src, значение dst читать не надо, это, считай, в два раза уменьшает bandwidth.

Страницы: 1 2 3 Следующая

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр