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


Буфер кадров Альфа (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)
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);

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

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

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