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


Отрисовка целевых объектов, устройств и ресурсов

Целевой объект отрисовки — это просто расположение, в котором будет отображаться программа. Как правило, целевой объект отрисовки — это окно (в частности, клиентская область окна). Это также может быть растровое изображение в памяти, которое не отображается. Целевой объект отрисовки представлен интерфейсом ID2D1RenderTarget .

Устройство — это абстракция, представляющая то, что на самом деле рисует пиксели. Аппаратное устройство использует GPU для повышения производительности, в то время как программное устройство использует ЦП. Приложение не создает устройство. Вместо этого устройство создается неявно, когда приложение создает целевой объект отрисовки. Каждый целевой объект отрисовки связан с определенным устройством либо оборудованием, либо программным обеспечением.

Схема, показывющая связь между целевым объектом отрисовки и устройством.

Ресурс — это объект, который программа использует для рисования. Ниже приведены некоторые примеры ресурсов, определенных в Direct2D:

  • Кисть. Определяет, как окрашены линии и регионы. Типы кистей включают кисти сплошного цвета и градиентные кисти.
  • Стиль штриха. Определяет внешний вид линии, например пунктирной или сплошной.
  • Геометрия. Представляет коллекцию линий и кривых.
  • Сетка. Фигура, сформированная из треугольников. Данные сетки могут быть обработаны напрямую GPU, в отличие от геометрических данных, которые необходимо преобразовать перед рендерингом.

Целевые объекты отрисовки также считаются типом ресурса.

Некоторые ресурсы пользуются аппаратным ускорением. Ресурс этого типа всегда связан с определенным устройством, оборудованием (GPU) или программным обеспечением (ЦП). Этот тип ресурса называется зависимым от устройства. Ресурсы, такие как кисти и сетки, зависят от устройств. Если устройство становится недоступным, ресурс должен быть повторно создан для нового устройства.

Другие ресурсы хранятся в памяти ЦП независимо от используемого устройства. Эти ресурсы являются независимыми от устройств, так как они не связаны с определенным устройством. При изменении устройства не требуется повторно создавать ресурсы, независимые от устройств. Стили росчерка и геометрии — это независимые от устройства ресурсы.

Документация по Windows для каждого ресурса указывает, зависит ли ресурс от устройства или не зависит от устройства. Каждый тип ресурса представлен интерфейсом, производным от ID2D1Resource. Например, кисти представлены интерфейсом ID2D1Brush .

Объект фабрики Direct2D

Первым шагом при использовании Direct2D является создание экземпляра объекта фабрики Direct2D. В компьютерном программировании фабрика — это объект, который создает другие объекты. Фабрика Direct2D создает следующие типы объектов:

  • Цели рендеринга.
  • Независимые от устройства ресурсы, такие как стили штрихов и геометрии.

Ресурсы, зависящие от устройств, такие как кисти и растровые изображения, создаются целевым объектом отрисовки.

Схема, показывющая фабрику direct2d.

Чтобы создать объект фабрики Direct2D, вызовите функцию D2D1CreateFactory .

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

Первый параметр — это флаг, указывающий параметры создания. Флаг D2D1_FACTORY_TYPE_SINGLE_THREADED означает, что вы не будете вызывать Direct2D из нескольких потоков. Чтобы поддерживать вызовы из нескольких потоков, укажите D2D1_FACTORY_TYPE_MULTI_THREADED. Если ваша программа использует один поток для работы с Direct2D, то вариант с одним потоком будет более эффективным.

Второй параметр функции D2D1CreateFactory получает указатель на ID2D1Factory интерфейс.

Необходимо создать объект фабрики Direct2D перед первым сообщением WM_PAINT. Обработчик сообщений WM_CREATE является хорошим местом для создания фабрики:

    case WM_CREATE:
        if (FAILED(D2D1CreateFactory(
                D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
        {
            return -1;  // Fail CreateWindowEx.
        }
        return 0;

Создание ресурсов Direct2D

Программа Circle использует следующие ресурсы, зависящие от устройств:

  • Целевой объект отрисовки, связанный с окном приложения.
  • Кисть одного цвета, чтобы раскрасить круг.

Каждый из этих ресурсов представлен интерфейсом COM:

Программа Circle сохраняет указатели на эти интерфейсы в виде переменных-членов MainWindow класса:

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

Следующий код создает эти два ресурса.

HRESULT MainWindow::CreateGraphicsResources()
{
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL)
    {
        RECT rc;
        GetClientRect(m_hwnd, &rc);

        D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(m_hwnd, size),
            &pRenderTarget);

        if (SUCCEEDED(hr))
        {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}

Чтобы создать целевой объект отрисовки для окна, вызовите метод ID2D1Factory::CreateHwndRenderTarget в фабрике Direct2D.

  • Первый параметр задает параметры, которые являются общими для любого типа целевого объекта отрисовки. Здесь мы передаваем параметры по умолчанию, вызывая вспомогательные функции D2D1::RenderTargetProperties.
  • Второй параметр задает дескриптор окна, а также размер целевого объекта отрисовки в пикселях.
  • Третий параметр получает указатель ID2D1HwndRenderTarget.

Чтобы создать кисть сплошного цвета, вызовите метод ID2D1RenderTarget::CreateSolidColorBrush на целевом объекте отрисовки. Цвет указан в виде значения D2D1_COLOR_F. Дополнительные сведения о цветах в Direct2D см. в разделе "Использование цвета" в Direct2D.

Кроме того, обратите внимание, что если целевой объект отрисовки уже существует, CreateGraphicsResources метод возвращает S_OK без каких-либо действий. Причина этого дизайна станет ясной в следующем разделе.

Далее

Рисование с использованием Direct2D