Буфер кадров Альфа (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);
Этот код выполняет линейное смешение между исходным цветом (цветом примитива, отрисовываемого в текущем расположении) и цветом назначения (цветом в текущем расположении в буфере кадров). Результирующий вид похож на тонированные стекла в том, что некоторые цвета целевого объекта, кажется, передаются через исходный объект; остальная его часть, как представляется, поглощается.
Многие из этих факторов смешения требуют альфа-значений в текстуре для правильной работы. Таким образом, при использовании альфа-канала вершины или материала приложение ограничивается тем, какие режимы будут давать интересные результаты.
Связанные темы