Войти
ПрограммированиеТерминыГрафика

Blending (Смешивание)

Blending - один из этапов графического конвейера, который работает после выполнения фрагментного (пиксельного) шейдера и post Depth/Stencil тестов.
Blending позволяет смешивать полученный в результате расчётов фрагментного шейдера цвет, и тот цвет, который находится в буфере кадра. Смешивание производится по формуле:

result = srcColor * srcBlend [blendOp] dstColor * dstBlend;
Где
srcColor - текущий цвет
dstColor - цвет из буфера кадра.
srcBlend и dstBlend - параметр, устанавливаемый программой, и может принимать следующие значения:
ПараметрНазвание в Direct3D10Название в Direct3D9Название в OpenGLДополнение
(0, 0, 0, 0)D3D10_BLEND_ZEROD3DBLEND_ZEROGL_ZEROВсе компоненты цвета умножаються на 0
(1, 1, 1, 1)D3D10_BLEND_ONED3DBLEND_ONEGL_ONEВсе компоненты цвета умножаються на 1
(Rs,Gs,Bs,As)D3D10_BLEND_SRC_COLORD3DBLEND_SRCCOLORGL_SRC_COLORПокомпонентное умножение на source цвет
(1-Rs,1-Gs,1-Bs,1-As)D3D10_BLEND_INV_SRC_COLORD3DBLEND_INVSRCCOLORGL_ONE_MINUS_SRC_COLORЦвет по-компонентно умножается на инвертированный source цвет
(As,As,As,As)D3D10_BLEND_SRC_ALPHAD3DBLEND_SRCALPHAGL_SRC_ALPHAВсе компоненты цвета умножаются на source alpha
(1-As,1-As,1-As,1-As)D3D10_BLEND_INV_SRC_ALPHAD3DBLEND_INVSRCALPHAGL_ONE_MINUS_SRC_ALPHAВсе компоненты цвета умножаются на инвертированную source alpha
(Ad,Ad,Ad,Ad)D3D10_BLEND_DEST_ALPHAD3DBLEND_DESTALPHAGL_DST_ALPHAВсе компоненты цвета умножаются на destination alpha
(1-Ad,1-Ad,1-Ad,1-Ad)D3D10_BLEND_INV_DEST_ALPHAD3DBLEND_INVDESTALPHAGL_ONE_MINUS_DST_ALPHAВсе компоненты цвета умножаются на инвертированную destination alpha
(Rd,Gd,Bd,Ad)D3D10_BLEND_DEST_COLORD3DBLEND_DESTCOLORGL_DST_COLORПокомпонентное умножение на destination цвет
(1-Rd,1-Gd,1-Bd1-Ad)D3D10_BLEND_INV_DEST_COLORD3DBLEND_INVDESTCOLORGL_ONE_MINUS_DST_COLORЦвет по-компонентно умножается на инвертированный destination цвет
(f,f,f,1)-D3DBLEND_SRCALPHASATGL_SRC_ALPHA_SATURATERGB умножается на f=min(As,1-Ad), A на единицу

Надо отметить, что в OpenGL, версии 1.3 и ниже, установить параметр (Rs,Gs,Bs,As) для srcBlend или (Rd,Gd,Bd,Ad) для dstBlend можно только при наличии расширения GL_NV_blend_square, которое к счастью поддерживается видеокартами от GeForce256 и Radeon. Начиная с версии 1.4 данная возможность находиться в OpenGL ядре.

При наличии D3DPBLENDCAPS_BLENDFACTOR в DX или GL_EXT_blend_color в GL (в ядре с версии 1.2) с появляются дополнительные значения:

ПараметрНазвание в Direct3D10Название в Direct3D9Название в OpenGLДополнение
(Rc,Gc,Bc,Ac)D3D10_BLEND_BLEND_FACTORD3DBLEND_BLENDFACTORGL_CONSTANT_COLORПокомпонентное умножение на константный цвет
(1-Rc,1-Gc,1-Bc,1-Ac)D3D10_BLEND_INV_BLEND_FACTORD3DBLEND_INVBLENDFACTORGL_ONE_MINUS_CONSTANT_COLORПо-компонентное умножение на инв. константный цвет
(Ac,Ac,Ac,Ac)D3D10_BLEND_BLEND_FACTOR-GL_CONSTANT_ALPHAПо-компонентное умножение на константную альфу
(1-Ac,1-Ac,1-Ac,1-Ac)D3D10_BLEND_INV_BLEND_FACTOR-GL_ONE_MINUS_CONSTANT_ALPHAПокомпонентное умножение на инв. константную альфу

Индекс s - source, d - destination, c - constant.
По умолчанию srcBlend = (1, 1, 1, 1), а dstBlend = (0, 0, 0, 0)

Также при возможности видеокарты может быть установлена операция blendOp (Cs = srcColor * srcBlend, Cd = dstColor * dstBlend):

ПараметрНазвание в Direct3D10Название в Direct3D9Название в OpenGLДополнение
Cs+ CdD3D10_BLEND_OP_ADDD3DBLENDOP_ADDGL_FUNC_ADD_EXTСложение (по умолчанию)
min(Cs, Cd)D3D10_BLEND_OP_MIND3DBLENDOP_MINGL_MIN_EXTМинимум (требует GL_EXT_blend_minmax\D3DPMISCCAPS_BLENDOP)
max(Cs, Cd)D3D10_BLEND_OP_MAXD3DBLENDOP_MAXGL_MAX_EXTМаксимум (требует GL_EXT_blend_minmax\D3DPMISCCAPS_BLENDOP)
Cs - CdD3D10_BLEND_OP_SUBTRACTD3DBLENDOP_SUBTRACTGL_FUNC_SUBTRACT_EXTВычитание (требует GL_EXT_blend_subtract\D3DPMISCCAPS_BLENDOP)
Cd - CsD3D10_BLEND_OP_REV_SUBTRACTD3DBLENDOP_REVSUBTRACTGL_FUNC_REVERSE_SUBTRACT_EXTОбратное вычитание (требует GL_EXT_blend_subtract\D3DPMISCCAPS_BLENDOP)

(Поддержка начиная с Radeon8500 и GeForce2)
Существует также ГЛ расширение GL_EXT_blend_logic_op, позволяющее делать побитовые операции между Cs и  Cd, но оно нам не интересно, так как поддерживается только картами ATI FireGL)

Для установки названных выше операций и параметров используются следующие функции:
Для включения блендинга

GL: glEnable(GL_BLEND);
DX: SetRenderState(D3DRS_ALPHABLENDENABLE, true);
Для установки параметров srcBlend и dstBlend
GL: glBlendFunc(srcBlend, dstBlend);
DX: SetRenderState(D3DRS_SRCBLEND, srcBlend);
    SetRenderState(D3DRS_DESTBLEND, dstBlend);
Для установки константного цвета
GL: glBlendColorEXT(r, g, b, a);
DX: SetRenderState(D3DRS_BLENDFACTOR, D3DCOLOR(r, g, b, a));
Для установки blendOp
GL: glBlendEquationEXT(blendOp);
DX: SetRenderState(D3DRS_BLENDOP, blendOp);

Но это ещё не все возможности стадии смешивания. Существуют дополнительные расширения, которые позволяют разделить операции, производимые над rgb цветом и альфой. Эта возможность называется separate alpha blend. При его включении блендинг производиться по формулам:

result.rgb = srcColor.rgb * srcBlend [blendOp] dstColor.rgb * dstBlend;
result.a = srcColor.a * srcBlendAlpha [blendOp] dstColor.a * dstBlendAlpha;
Для параметров srcBlendAlpha и dstBlendAlpha используються типы, описанные в таблицах выше. Альфа умножается на четвёртую альфа-компоненту параметра.

В GL раздельный блендинг устанавливается командой

glBlendFuncSeparateEXT(srcBlend, dstBlend, srcBlendAlpha, dstBlendAlpha);
при поддержке расширения GL_EXT_blend_func_separate (Radeon8500+, GeForce5200+)
В DX используются функции
SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, true);
SetRenderState(D3DRS_SRCBLENDALPHA, srcBlendAlpha);
SetRenderState(D3DRS_DESTBLENDALPHA, dstBlendAlpha);
при поддержке D3DPMISCCAPS_SEPARATEALPHABLEND

Но и это ещё не всё! Можно также установить отдельные blendOp's для rgb и альфы.

result.rgb = srcColor.rgb * srcBlend [blendOp] dstColor.rgb * dstBlend;
result.a = srcColor.a * srcBlendAlpha [blendOpAlpha] dstColor.a * dstBlendAlpha;

В GL это производиться командой

glBlendEquationSeparateEXT(blendOp, blendOpAlpha);
при поддержке GL_EXT_blend_equation_separate (Radeon8500+ (только на Apple!), GeForce6100+)
В DX используется связка
SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, true);
SetRenderState(D3DRS_BLENDOPALPHA, blendOpAlpha);

Что такое Blending (Смешивание)?

#Direct3D, #OpenGL, #pipeline

12 мая 2007 (Обновление: 18 апр. 2013)

Комментарии [5]