Использование цвета в Direct2D
Direct2D использует цветовую модель RGB, в которой цвета формируются путем объединения различных значений красного, зеленого и синего. Четвертый компонент, альфа, измеряет прозрачность пикселя. В Direct2D каждый из этих компонентов является значением с плавающей запятой с диапазоном [0,0 1,0]. Для трех компонентов цвета значение измеряет интенсивность цвета. Для альфа-компонента 0,0 означает полностью прозрачный, а 1,0 — полностью непрозрачный. В следующей таблице показаны цвета, которые возникают в результате различных сочетаний 100 % интенсивности.
Красный | Зеленый | Синий | Color |
---|---|---|---|
0 | 0 | 0 | Черный |
1 | 0 | 0 | Красный |
0 | 1 | 0 | Зеленый |
0 | 0 | 1 | Синий |
0 | 1 | 1 | Голубой |
1 | 0 | 1 | Пурпурный |
1 | 1 | 0 | Желтый |
1 | 1 | 1 | White |
Значения цвета в диапазоне от 0 до 1 приводят к различным оттенкам этих чистых цветов. Direct2D использует структуру D2D1_COLOR_F для представления цветов. Например, в следующем коде указывается пурпурная.
// Initialize a magenta color.
D2D1_COLOR_F clr;
clr.r = 1;
clr.g = 0;
clr.b = 1;
clr.a = 1; // Opaque.
Можно также указать цвет с помощью класса D2D1::ColorF , который является производным от структуры D2D1_COLOR_F .
// Equivalent to the previous example.
D2D1::ColorF clr(1, 0, 1, 1);
Альфа-смешивание
Альфа-наложение создает полупрозрачные области путем смешивания цвета переднего плана с цветом фона с помощью следующей формулы.
- color = af * Cf + (1 - af) * Cb
где Cb — цвет фона, Cf — цвет переднего плана , af — альфа-значение цвета переднего плана. Эта формула применяется попарно к каждому компоненту цвета. Например, предположим, что цвет переднего плана — (R = 1,0, G = 0,4, B = 0,0), альфа — 0,6, а цвет фона — (R = 0,0, G = 0,5, B = 1,0). Результирующий альфа-смешиваемый цвет:
R = (1,0 * 0,6 + 0 * 0,4) = .6
G = (0,4 * 0,6 + 0,5 * 0,4) = .44
B = (0 * 0,6 + 1,0 * 0,4) = .40
На следующем рисунке показан результат этой операции смешивания.
Форматы пикселей
Структура D2D1_COLOR_F не описывает, как пиксель представлен в памяти. В большинстве случаев это не имеет значения. Direct2D обрабатывает все внутренние сведения о преобразовании цветовой информации в пиксели. Но вам может потребоваться знать формат пикселей, если вы работаете непосредственно с растровым изображением в памяти или если вы объединяете Direct2D с Direct3D или GDI.
Перечисление DXGI_FORMAT определяет список форматов пикселей. Список довольно длинный, но только некоторые из них относятся к Direct2D. (Остальные используются Direct3D.)
Формат пикселей | Описание |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM |
Это наиболее распространенный формат пикселей. Все компоненты пикселей (красный, зеленый, синий и альфа-) являются 8-разрядными целыми числами без знака. Компоненты расположены в памяти в порядке BGRA . (См. рисунок ниже.) |
DXGI_FORMAT_R8G8B8A8_UNORM |
Пиксельные компоненты — это 8-разрядные целые числа без знака в порядке RGBA . Другими словами, красный и синий компоненты меняются местами относительно DXGI_FORMAT_B8G8R8A8_UNORM. Этот формат поддерживается только для аппаратных устройств. |
DXGI_FORMAT_A8_UNORM |
Этот формат содержит 8-разрядный альфа-компонент без компонентов RGB. Это полезно для создания масок непрозрачности. Дополнительные сведения об использовании масок непрозрачности в Direct2D см. в статье Общие сведения о совместимых целевых объектах отрисовки A8. |
На следующем рисунке показан макет пикселей BGRA.
Чтобы получить формат пикселей целевого объекта отрисовки, вызовите ID2D1RenderTarget::GetPixelFormat. Формат пикселей может не соответствовать разрешению экрана. Например, для дисплея может быть задан 16-разрядный цвет, даже если целевой объект отрисовки использует 32-разрядный цвет.
Альфа-режим
Целевой объект отрисовки также имеет альфа-режим, который определяет, как обрабатываются альфа-значения.
Альфа-режим | Описание |
---|---|
D2D1_ALPHA_MODE_IGNORE | Альфа-смешивание не выполняется. Альфа-значения игнорируются. |
D2D1_ALPHA_MODE_STRAIGHT | Прямая альфа-версия. Компоненты цвета пикселя представляют интенсивность цвета до альфа-смешивания. |
D2D1_ALPHA_MODE_PREMULTIPLIED | Предварительная альфа-версия. Компоненты цвета пикселя представляют интенсивность цвета, умноженную на альфа-значение. Этот формат более эффективен для отрисовки, чем прямой альфа-канал, так как термин (af Cf) из формулы альфа-смешивания предварительно вычисляется. Однако этот формат не подходит для хранения в файле изображения. |
Ниже приведен пример разницы между прямой альфа-и предварительной альфа-репликой. Предположим, что требуемый цвет — чистый красный (100 % интенсивность) с 50 % альфа. Как тип Direct2D этот цвет будет представлен как (1, 0, 0, 0, 0,0,5). При использовании прямой альфа-функции и 8-разрядных компонентов цвета красный компонент пикселя 0xFF. При использовании предварительного альфа-канала красный компонент масштабируется на 50 % до 0x80.
Тип данных D2D1_COLOR_F всегда представляет цвета с помощью прямого альфа-канала. При необходимости Direct2D преобразует пиксели в предварительно подготовленный альфа-формат.
Если вы знаете, что программа не будет выполнять альфа-наложение, создайте целевой объект отрисовки с D2D1_ALPHA_MODE_IGNORE альфа-режиме. Этот режим может повысить производительность, так как Direct2D может пропускать альфа-вычисления. Дополнительные сведения см. в статье Повышение производительности приложений Direct2D.