Поделиться через


Frame Buffer Alpha (Direct3D 9)

Буфер буфера кадра альфа-смешивания немного отличается от вершин альфа-, материал альфа и текстуры альфа-текстуры. Значения прозрачности вершин, материалов и текстуры альфа-набора, которые используются только для текущего примитива, и сами по себе не влияют на другие примитивы. Буфер буфера кадра альфа-смешивания управляет тем, как текущий примитив сочетается с существующими пикселями в буфере кадра, чтобы получить окончательный цвет пикселя.

При выполнении альфа-смешения два цвета объединяются: исходный цвет и целевой цвет. Исходный цвет от прозрачного объекта, целевой цвет уже находится в расположении пикселя. Цвет назначения является результатом отрисовки другого объекта, который находится за прозрачным объектом, то есть объект, который будет отображаться через прозрачный объект. Альфа-смесь использует формулу для управления соотношением между исходными и целевыми объектами.

Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor 

ObjectColor — это вклад от примитива, отрисовываемого в текущем расположении пикселя. PixelColor — это вклад из буфера кадра в текущем расположении пикселя.

Ниже приведен набор факторов альфа-смешения, которые можно использовать.

Фактор режима смешивания Описание
D3DBLEND_ZERO (0, 0, 0, 0)
D3DBLEND_ONE (1, 1, 1, 1)
D3DBLEND_SRCCOLOR (Rs, Gs, Bs, As)
D3DBLEND_INVSRCCOLOR (1-rs, 1-Gs, 1-Bs, 1-As)
D3DBLEND_SRCALPHA (As, As, As, As)
D3DBLEND_INVSRCALPHA (1-As, 1-As, 1-As, 1-As)
D3DBLEND_DESTALPHA (Ad, Ad, Ad, Ad, Ad)
D3DBLEND_INVDESTALPHA (1-Ad, 1-Ad, 1-Ad, 1-Ad)
D3DBLEND_DESTCOLOR (Rd, Gd, Bd, Ad)
D3DBLEND_INVDESTCOLOR (1-Rd, 1-Gd, 1-Bd, 1-Ad)
D3DBLEND_SRCALPHASAT (f, f, f, 1); f = min(As, 1-Ad)
D3DBLEND_BOTHSRCALPHA Устарело для DirectX 6 и более поздних версий. Вы можете добиться того же эффекта, задав факторы смешения источника и назначения для D3DBLEND_SRCALPHA и D3DBLEND_INVSRCALPHA в отдельных вызовах.
D3DBLEND_BOTHINVSRCALPHA Устарело для DirectX 6. Вы можете добиться того же эффекта, задав факторы смешения источника и назначения для D3DBLEND_INVSRCALPHA и D3DBLEND_SRCALPHA в отдельных вызовах.
D3DBLEND_BLENDFACTOR Используйте color.r, color.g, color.b и color.a, полученный из параметра D3DRS_BLENDFACTOR.
D3DBLEND_INVBLENDFACTOR Используйте 1-color.r, 1-color.g, 1-color.b и 1-color.a, полученный из параметра D3DRS_BLENDFACTOR.

 

Direct3D использует состояние D3DRS_ALPHABLENDENABLE отрисовки для включения смешивания альфа-прозрачности. Тип альфа-смешивания, который выполняется, зависит от состояния D3DRS_SRCBLEND и D3DRS_DESTBLEND отрисовки. Исходные и целевые состояния смешения используются в парах. Следующий фрагмент кода задает исходное состояние смешивания для D3DBLEND_SRCCOLOR и конечного состояния смешивания D3DBLEND_INVSRCCOLOR.

// This code fragment assumes that lpD3DDevice is a 
//   valid pointer to a device.

// Enable alpha blending.
lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 
                            TRUE);

// Set the source blend state.
lpD3DDevice->SetRenderState(D3DRS_SRCBLEND, 
                            D3DBLEND_SRCCOLOR);

// Set the destination blend state.
lpD3DDevice->SetRenderState(D3DRS_DESTBLEND, 
                            D3DBLEND_INVSRCCOLOR);

Этот код выполняет линейную смесь между исходным цветом (цветом отрисовываемого примитивом в текущем расположении) и целевым цветом (цветом в текущем расположении в буфере кадра). Результирующий внешний вид похож на оттененное стекло в том, что некоторый цвет целевого объекта, кажется, передается через исходный объект; Остальная часть, как представляется, поглощается.

Многие из этих факторов смешивания требуют правильной работы альфа-значений в текстуре. Таким образом, при использовании вершины или материала альфа приложение ограничено тем, какие режимы будут производить интересные результаты.

альфа-смешивания