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


Использование цвета в 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

изображение, отображающее цвета rgb.

Значения цвета в диапазоне от 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.

Схема, показывающая макет пикселей 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.

Следующая

Применение преобразований в Direct2D