Здравствуй, форум!
Требуется решить банальную на первый взгляд задачу: есть у нас полупрозрачный меш (например, облако, состоящее из полупрозрачных спрайтов), надо отрендерить этот меш в текстуру и потом рендерить эту текстуру на квад. Вроде все просто. Но не могу понять, как быть с альфа-блендингом при рендеринге в текстуру?
Рендерю в текстуру с помощью fbo, сначала очищаю текстуру полностью прозрачным цветом (например 0x000000), потом устанавливаю функцию для альфа-блендинга вот такую (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), потом рендерю меш в эту текстуру. Но при рендеринге в текстуру происходит смешивание цвета меша с цветом фона, и в итоге отрендеренный меш в текстуре выглядит более темным (если цвет очистки был черным), так что использовать такую текстуру дальше становится невозможно.
Вобщем вопрос: каким образом надо рендерить полупрозрачную геометрию в текстуру, чтобы не было такого косяка, который описан выше?
glClearColor(1.0,1.0,1.0,1.0)
Заливай прозрачным белым.
ASP
> glClearColor(1.0,1.0,1.0,1.0)
> Заливай прозрачным белым.
если заливать прозрачным белым (кстати, 1.0 для альфы - это вроде полностью непрозрачный?), то цвет фрагментов отрендеренного меша будет блендиться с белым, и в итоге отрендеренный меш будет светлее. Проблема как раз в том, что при src_alpha - one_minus_src_alpha каждый фрагмент будет блендиться с значением цвета в колор-буффере, так что установка какого-то специфичного цвета заливки проблему не пофиксит. (
Есть у кого-нить еще идеи? По идее это должно решаться как-то просто, ведь импостеры везде используются.
ты уверен, что она становится темнее?
как проверял?
result = color * color.a + 0 * (1 - color.a)
цвет фона, вроде, не должен влиять
попробуй так
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)
попробуй поэкспериментировать в сторону premultiplied alpha
ASP
> ты уверен, что она становится темнее?
> как проверял?
> result = color * color.a + 0 * (1 - color.a)
> цвет фона, вроде, не должен влиять
color.a = 0.5 => result = color * 0.5; - становится темнее
а проверял так, что становится блин темнее, это сразу в глаза бросается.
ASP
> glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)
хм, в итоге будет та же самая картинка (неправильная), только полностью прозрачная, так как будет использоваться альфа с текстуры, а не с фрагментов меша. Не?
она будет полностью не прозрачная в тех местах где ты рисовал объекты на текстуру
у тебя объект на который накладываешь эту текстуру тоже с прозрачностью выводится?
тогда она, наверное, становится темнее из-за того, что прозрачность больше, т.к. и текстура имеет прозрачность, там где не должна быть прозрачна
ASP
> glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)
ASP
> она будет полностью не прозрачная в тех местах где ты рисовал объекты на
> текстуру
в этом случае альфа будет вычисляться так: A = srcA * 0 + dstA * 1 = dstA
dstA = 0, так как текстуру залили полностью прозрачным цветов. Почему текстура будет непрозрачная хоть в каком-нибудь месте?
Есть ли у кого-нить дельные предложения? Очень надо вобще
Тебе уже ответили эта проблема решается glBlendFuncSeparate.
JKot
> Тебе уже ответили эта проблема решается glBlendFuncSeparate.
то есть glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) и glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE) дадут в итоге разные изображения в текстуре? (финальные значения альфа в расчет пока не берем)
Нужно либо glBlendFunc либо glBlendFuncSeparate, одновременно их использовать не имеет смысла.
По моему, такие параметры нужны:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Попробуй в конце концов =)
P.S: Можно так-же эмулировать glBlendFuncSeparate, рендеря в 2 прохода, но думаю это лишнее.
Тема в архиве.