Общие сведения о целевых объектах визуализации
Целевой объект отрисовки — это ресурс, наследующий интерфейс ID2D1RenderTarget. Целевой объект отрисовки создает ресурсы для рисования и выполняет фактические операции рисования. В этом разделе описаны различные типы целевых объектов отрисовки Direct2D и их использование.
-
Цели отрисовки
- целевые функции отрисовки
- Ресурсы цели отрисовки
- команды рисования
- обработка ошибок
- пример : отображение содержимого в окне
Целевые объекты отрисовки
Целевой объект отрисовки — это ресурс, наследующий интерфейс ID2D1RenderTarget. Целевой объект отрисовки создает ресурсы для рисования и выполняет фактические операции рисования. Существует несколько типов целевых объектов отрисовки, которые можно использовать для отрисовки графики следующими способами:
- ID2D1HwndRenderTarget объекты отрисовывают содержимое в окне.
- ID2D1DCRenderTarget объекты, отображаемые в контексте устройства GDI.
- Целевые объекты рендеринга растровых изображений отрисовывают содержимое в растровом рисунке вне экрана.
- Целевые объекты DXGI отрисовываются на поверхность DXGI для использования с Direct3D.
Так как целевой объект отрисовки связан с определенным устройством отрисовки, он является ресурсом, зависящим от устройства, и перестает функционировать, если устройство удалено.
Особенности целевой поверхности рендеринга
Можно указать, использует ли целевой объект отрисовки аппаратное ускорение и отрисовывается ли удаленный дисплей локальным или удаленным компьютером. Целевые объекты отрисовки можно настроить для псевдонима или защиты отрисовки. Для отрисовки сцен с большим количеством примитивов разработчик может также отображать 2-D графику в режиме без сглаживания и применять мультисэмпловое сглаживание D3D для повышения масштабируемости.
Целевые объекты отрисовки также могут группировать операции рисования на слои, представленные интерфейсом ID2D1Layer. Слои полезны для сбора операций рисования, чтобы объединяться при рендеринге кадра. В некоторых сценариях это может быть полезной альтернативой отрисовке в растровом объекте и последующему повторному использованию его содержимого, так как затраты на выделение памяти для слоев ниже, чем для ID2D1BitmapRenderTarget.
Буферы отрисовки могут создавать новые буферы отрисовки, совместимые с самими собой, что полезно для промежуточной отрисовки вне экрана при сохранении различных свойств буфера отрисовки, заданных в оригинале.
Кроме того, можно выполнять отрисовку с помощью GDI на целевом объекте отрисовки Direct2D путем вызова QueryInterface на целевом объекте отрисовки для ID2D1GdiInteropRenderTarget, который имеет методы GetDC и ReleaseDC, которые можно использовать для получения контекста устройства GDI. Отрисовка с помощью GDI возможна только в том случае, если целевой объект отрисовки был создан с набором флагов D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE. Это полезно для приложений, которые в основном отрисовываются с помощью Direct2D, но имеют модель расширяемости или другое устаревшее содержимое, которое требует возможности отрисовки с помощью GDI. Дополнительные сведения см. в разделе Обзор взаимодействия Direct2D и GDI.
Отрисовка целевых ресурсов
Как и фабрика, целевой объект отрисовки может создавать ресурсы рисования. Все ресурсы, созданные целевым объектом отрисовки, — это ресурсы, зависящие от устройств (как и целевой объект отрисовки). Целевой объект отрисовки может создать следующие типы ресурсов:
- Растровые изображения
- Кисти
- Слои
- Сети
Команды рисования
Для отрисовки содержимого используются методы рисования целевой поверхности. Перед началом рисования вызовите метод ID2D1RenderTarget::BeginDraw. После завершения рисования вызовите метод ID2D1RenderTarget::EndDraw. Между этими вызовами используются методы Draw и Fill, чтобы отображать графические ресурсы. Большинство методов рисования и заливки принимают фигуру (либо примитив, либо геометрию) и кисть для заполнения или обводки фигуры.
Целевые объекты отрисовки предоставляют методы для обрезки, применения маски непрозрачности и преобразования пространства координат.
Direct2D использует левостороннюю систему координат: положительные значения оси x увеличиваются вправо, а положительные значения оси y увеличиваются вниз.
Обработка ошибок
Команды рисования целевого объекта не указывают, была ли запрошенная операция успешной. Чтобы узнать, есть ли ошибки рисования, вызовите метод Flush или метод EndDraw для получения HRESULT.
Пример: отображение содержимого в окне
В следующем примере используется метод CreateHwndRenderTargetдля создания ID2D1HwndRenderTarget.
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRenderTarget
);
В следующем примере для рисования текста в окне используется ID2D1HwndRenderTarget.
// Called whenever the application needs to display the client
// window. This method writes "Hello, World"
//
// Note that this function will automatically discard device-specific
// resources if the Direct3D device disappears during function
// invocation, and will recreate the resources the next time it's
// invoked.
//
HRESULT DemoApp::OnRender()
{
HRESULT hr;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
static const WCHAR sc_helloWorld[] = L"Hello, World!";
// Retrieve the size of the render target.
D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
m_pRenderTarget->DrawText(
sc_helloWorld,
ARRAYSIZE(sc_helloWorld) - 1,
m_pTextFormat,
D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
m_pBlackBrush
);
hr = m_pRenderTarget->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
hr = S_OK;
DiscardDeviceResources();
}
}
return hr;
}
Код был опущен в этом примере.