渲染目標概觀
轉譯目標是從介面 ID2D1RenderTarget 繼承而來的資源。 轉譯目標會建立繪製的資源,並執行實際的繪圖作業。 本主題描述不同類型的 Direct2D 轉譯目標,以及如何使用這些目標。
渲染目標
轉譯目標是從 ID2D1RenderTarget 介面繼承而來的資源。 渲染目標會創建繪圖資源,並執行實際的繪圖操作。 有數種轉譯目標可用來以下列方式轉譯圖形:
- ID2D1HwndRenderTarget 物件將內容轉譯至視窗。
- ID2D1DCRenderTarget 物件轉譯至 GDI 裝置內容。
- 位圖渲染目標物件會將內容渲染為螢幕外位圖。
- DXGI 渲染目標物件會渲染至 DXGI 表面,以便與 Direct3D 搭配使用。
因為轉譯目標與特定轉譯裝置相關聯,所以它是裝置相依的資源,如果移除裝置,它就會停止運作。
渲染目標功能
您可以指定渲染目標是否使用硬體加速,以及遠程顯示器是由本地计算机还是远程计算机进行渲染。 您可以為鋸齒化或反鋸齒化渲染設定渲染目標。 針對具有大量基本類型的轉譯場景,開發人員也可以在別名模式中轉譯 2D 圖形,並使用 D3D 多重取樣反鋸齒來達到更大的延展性。
轉譯目標也可以將繪圖作業分組為 ID2D1Layer 介面所代表的圖層。 在渲染畫面時,圖層可用於收集繪圖作業以便合成在一起。 在某些情況下,這可能是一個有用的替代方案,可用於將圖像渲染至位圖渲染目標,並重複利用位圖內容,因為分層的配置成本低於 ID2D1BitmapRenderTarget。
轉譯目標可以建立與本身相容的新轉譯目標,這對於中繼螢幕外轉譯很有用,同時保留原始上設定的各種轉譯目標屬性。
您也可以在 Direct2D 轉譯目標上使用 GDI 來轉譯,方法是在 ID2D1GdiInteropRenderTarget的轉譯目標上呼叫 QueryInterface,這個目標包含的 GetDC 和 ReleaseDC 方法可以用來擷取 GDI 裝置內容。 只有在使用設定 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 旗標建立轉譯目標時,才能透過 GDI 轉譯。 這適用於主要使用 Direct2D 轉譯但具有擴充性模型或其他需要使用 GDI 轉譯的舊版內容的應用程式。 如需詳細資訊,請參閱 Direct2D 和 GDI 互作概觀。
渲染目標資源
如同工廠一樣,轉譯目標可以創建繪圖資源。 轉譯目標所建立的任何資源都是裝置相依的資源(就像轉譯目標一樣)。 轉譯目標可以建立下列類型的資源:
- 點陣圖
- 刷子
- 層
- 網格
繪圖命令
若要轉譯內容,您可以使用轉譯目標繪圖方法。 開始繪製之前,請先呼叫 ID2D1RenderTarget::BeginDraw 方法。 完成繪圖之後,您會呼叫 ID2D1RenderTarget::EndDraw 方法。 在這些呼叫之間,您可以使用 Draw 和 Fill 方法來轉譯繪圖資源。 大部分的 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;
}
此範例已省略程序代碼。