日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Direct2D

發布時間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Direct2D 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

㈠ 關于Direct2D

??? Direct2D是一個硬件加速的,提供立即模式的二維圖形API。它提供了二維的幾何體,位圖,文本的高性能,高質量的渲染。十分方便的是,Direct2D與GDI,GDI+和D3D都是可以交互的。一項技術總是有其受眾面,看看微軟本身怎么說的:

  • 大型企業級本機應用程序開發人員。
  • 創建供下游開發人員使用的控件工具包和庫的開發人員。
  • 需要對二維圖形進行服務器端呈現的開發人員。
  • 使用 Direct3D 圖形,并且需要在菜單、用戶界面 (UI) 元素和抬頭顯示器 (HUD) 中使用高性能的簡單二維和文本呈現的開發人員。

㈡ Direct2D的架構

??? Direct2D是基于使用Direct3D 10.1的API,所以Direct2D的應用可以再渲染的時候受益于顯卡的硬件加速。以下是其架構圖,來源于Direct2D的document:

??? 在Direct2D的右下方,有一個軟件光柵化(software rasterizer),假如顯卡不支持硬件加速,那么Direct2D可以使用軟件方式渲染,即便是這樣,其效果還是要優于GDI的。在Direct 3D下面還有一層叫DXGI(DirectX Graphics Infrastructure (DXGI) ),對于DXGI,現在我還不是很了解,這里就不敢亂說了。抱歉抱歉。。

㈢ 視覺效果

??? 使用Direct2D渲染出來的效果要比GDI要好的多。因為Direct2D使用基于圖元的反鋸齒效果(這樣會使線條更加的平滑),而且在渲染二維圖元的時候,完全支持透明和alpha混合。以下是對比的照片:

??? 兩者的對比很明顯吧!顯然,右邊的Direct2D的線條效果要好于左邊的GDI。

㈢ 交互性

??? 介紹交互性,先看看下面這張圖:

??? 此張圖介紹了Direct2D與Direct3D,GDI+,GDI,DirectWrite,Windows Imaging Component (WIC)的交互性。在這張圖中列出了與各個不同的平臺交互的函數。雖然對其中的某些平臺不了解,但看起來好像很厲害的樣子。

㈣ Direct2D的Hello World

⑴ Direct2D的頭文件

??? Direct2D API定義于以下頭文件中:

頭文件

描述

d2d1.h 定義了主要的Direct2D API
d2d1helper.h 定義了C++幫助函數,類和結構
d2dbasetypes.h 定義了Direct2D的主要繪圖,例如:點,矩形等。其頭文件也包含在d2d1.h之中。
d2derr.h 定義了異常代碼在Direct2D中。其頭文件也包含在d2d1.h之中。

??? 除了包含這些頭文件,還有包含d2d1.lib這個庫。你可以在Windows Software Development Kit (SDK) for Windows 7中可以找到以上這些東西。

⑵ 基本術語解釋

① Direct2D Resources(資源)

??? 所謂的資源,指的是視頻內存或系統內存的某種分配。舉例來說,位圖和畫筆就是資源。Direct2D提供了更直接的映射來充分利用 GPU。它提供了兩類資源:與設備無關的資源和與設備有關的資源。(以下兩部分內容來自msdn上的解釋)

?? ⅰ 與設備無關的資源(如 ID2D1Geometry)保留在 CPU 上。

  • ID2D1DrawingStateBlock
  • ID2D1Factory
  • ID2D1Geometry 以及從其繼承的接口。
  • ID2D1GeometrySink 和 ID2D1SimplifiedGeometrySink
  • ID2D1StrokeStyle

?? ⅱ 與設備有關的資源(如 ID2D1RenderTarget 和 ID2D1LinearGradientBrush)直接映射到 GPU 上的資源(如果硬件加速可用)。通過將來自幾何對象的頂點和覆蓋信息與由與設備有關的資源生成的紋理信息進行組合,來執行呈現調用。

  • ID2D1Brush 以及從其繼承的接口。使用呈現器目標可創建畫筆。
  • ID2D1Layer 使用呈現器目標可創建層。
  • ID2D1RenderTarget 以及從其繼承的接口。若要創建呈現器目標,請使用工廠或其他呈現器目標。

② RenderTarget(渲染目標)

??? 渲染目標是從ID2D1RenderTarget 接口繼承的資源。其用于創建繪制的資源,并執行實際的繪制操作。你可以通過以下方式使用多種類型的渲染目標來呈現圖形:。(以下部分內容來自msdn上的解釋)

  • ID2D1HwndRenderTarget 對象將內容呈現到窗口。
  • ID2D1DCRenderTarget 對象呈現到 GDI 設備上下文。
  • 位圖呈現器目標對象將內容呈現到屏幕外位圖。
  • DXGI 呈現器目標對象呈現到用于 Direct3D 的 DXGI 圖面。

③ Brush(畫筆)

??? 畫筆用其輸出來“繪制”區域,不同的畫筆具有不同的輸出類型。Direct2D 提供了四種畫筆:。(以下部分內容來自msdn上的解釋)

  • ID2D1SolidColorBrush 用純色繪制區域
  • ID2D1LinearGradientBrush 用線性漸變繪制區域
  • ID2D1RadialGradientBrush 用徑向漸變繪制區域
  • ID2D1BitmapBrush 用位圖繪制區域

④ ID2D1Geometry(幾何對象)

??? Direct2D 幾何對象是由 ID2D1Factory 創建的與設備無關的不可變資源。其對象可以是簡單幾何對象(ID2D1RectangleGeometry、ID2D1RoundedRectangleGeometry 或 ID2D1EllipseGeometry)、路徑幾何對象 (ID2D1PathGeometry) 或復合幾何對象(ID2D1GeometryGroup 和ID2D1TransformedGeometry)。

⑤ Bitmap(位圖)

??? Direct2D 不提供用于加載或存儲位圖的方法;而是使您可以使用 Windows 圖像處理組件 (WIC) 創建位圖。位圖資源可以使用 WIC 進行加載,然后通過 ID2D1RenderTarget::CreateBitmapFromWicBitmap 方法用于創建 ID2D1Bitmap。

⑶ Hello World來了,創建一個矩形!

① 包含 Direct2D 頭文件

// windows的頭文件 #include <windows.h> ? // Direct2D的頭文件 #include <d2d1.h>

② 創建一個ID2D1Factory

??? ID2D1Factory是使用 Direct2D 的起點,使用 ID2D1Factory 可創建 Direct2D 資源。

ID2D1Factory* pd2dfactory = null; HRESULT hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &pd2dfactory );

③ 創建 ID2D1HwndRenderTarget

??? 創建工廠之后,我們要創建渲染目標。具體見下面的代碼:

HRESULT hr = S_OK; ? if (!m_pRenderTarget) { RECT rc; GetClientRect(m_hwnd, &rc); ? D2D1_SIZE_U size = D2D1::SizeU( rc.right - rc.left, rc.bottom - rc.top ); ? // 創建一個Direct2D渲染目標,m_pRenderTarget這是我們要創建的。 hr = m_pDirect2dFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(m_hwnd, size), &m_pRenderTarget ); ? if (SUCCEEDED(hr)) { // 創建一個灰色的畫筆,調用的是CreateSolidColorBrush函數,LightSlateGray這是筆的顏色 hr = m_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::LightSlateGray), &m_pLightSlateGrayBrush ); } if (SUCCEEDED(hr)) { // 創建一個藍色的畫筆 hr = m_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::CornflowerBlue), &m_pCornflowerBlueBrush ); } }

④ 繪制矩形

HRESULT hr = S_OK; ? hr = CreateDeviceResources(); // 創建好了m_pRenderTarget ? if (SUCCEEDED(hr)) { m_pRenderTarget->BeginDraw(); // 繪制就在BeginDraw()和EndDraw()之間 ? m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); ? m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue)); // 背景顏色 ? D2D1_SIZE_F rtSize = m_pRenderTarget->GetSize(); ? // 繪制一個網格背景 int width = static_cast<int>(rtSize.width); int height = static_cast<int>(rtSize.height); ? for (int x = 0; x < width; x += 10) { m_pRenderTarget->DrawLine( D2D1::Point2F(static_cast<FLOAT>(x), 0.0f), D2D1::Point2F(static_cast<FLOAT>(x), rtSize.height), m_pLightSlateGrayBrush, 0.5f ); } ? for (int y = 0; y < height; y += 10) { m_pRenderTarget->DrawLine( D2D1::Point2F(0.0f, static_cast<FLOAT>(y)), D2D1::Point2F(rtSize.width, static_cast<FLOAT>(y)), m_pLightSlateGrayBrush, 0.5f ); } ? //繪制兩個矩形 D2D1_RECT_F rectangle1 = D2D1::RectF( rtSize.width/2 - 50.0f, rtSize.height/2 - 50.0f, rtSize.width/2 + 50.0f, rtSize.height/2 + 50.0f ); ? D2D1_RECT_F rectangle2 = D2D1::RectF( rtSize.width/2 - 100.0f, rtSize.height/2 - 100.0f, rtSize.width/2 + 100.0f, rtSize.height/2 + 100.0f ); ? ? // 繪制一個實心的矩形 m_pRenderTarget->FillRectangle(&rectangle1, m_pLightSlateGrayBrush); ? // 繪制一個空心的矩形 m_pRenderTarget->DrawRectangle(&rectangle2, m_pCornflowerBlueBrush); ? // 結束繪制 hr = m_pRenderTarget->EndDraw(); } ? if (hr == D2DERR_RECREATE_TARGET) { hr = S_OK; DiscardDeviceResources(); // 釋放資源 }

⑤ 釋放資源

template<class Interface> inline void SafeRelease( Interface **ppInterfaceToRelease ) { if (*ppInterfaceToRelease != NULL) { (*ppInterfaceToRelease)->Release(); ? (*ppInterfaceToRelease) = NULL; } } ? // 上面是釋放函數,下面是釋放的對象! SafeRelease(&m_pRenderTarget); SafeRelease(&m_pLightSlateGrayBrush); SafeRelease(&m_pCornflowerBlueBrush);

??? 這是執行的結果:

??? 弄了兩天才寫好,上面的有些東西也不是特別了解,請見諒!但是應該會隨著時間的推移,了解更深的。如果大牛們看到其中的不足,請大牛們指正,本人不甚感激!

?

參考文獻

1. msdn文檔:http://msdn.microsoft.com/zh-cn/library/dd370990(v=vs.85).aspx

2.還是msdn文檔。。。。因為本文是基于文檔寫成的。

總結

以上是生活随笔為你收集整理的关于Direct2D的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜影院免费体验区 | 在线观看福利视频 | 国产男女猛烈无遮挡a片漫画 | 91天堂在线观看 | 亚洲综合精品国产一区二区三区 | 一区二区三区在线观看免费 | 免费一区二区三区视频在线 | 永久免费未网 | 99精品乱码国产在线观看 | 免费一级a毛片夜夜看 | 欧美黑吊大战白妞欧美大片 | 成人午夜福利一区二区 | 狠狠躁18三区二区一区 | 欧美无遮挡高潮床戏 | 国产综合福利 | 一区二区三区蜜桃 | 99热这里 | av黄色影院| 草av在线 | 男女激情在线观看 | 中文字幕第一区 | 欧美精品 在线观看 | 人人超碰在线 | 国产91福利 | 亚洲国产中文字幕在线观看 | 大地资源二中文在线影视观看 | 日韩精品第三页 | 粉嫩在线| 久久婷婷国产麻豆91天堂 | 椎名空在线播放 | 精品一性一色一乱农村 | 日本成人在线免费视频 | 久久综合国产 | 国产av一区精品 | 日韩精品一区三区 | 亚洲视频999 | 一区二区三区在线观看 | 国产三级三级三级 | 涩涩屋污 | 亚洲av片在线观看 | 视频一区二区在线播放 | 国产一区美女 | 28一20岁女人一级 | 欧美性做爰毛片 | 一区二区导航 | 黑人中文字幕一区二区三区 | 精品久久久久久久久久久aⅴ | 日韩视频免费在线观看 | 少妇扒开粉嫩小泬视频 | 色偷偷人人澡人人爽人人模 | 污网站在线免费看 | 91传媒理伦片在线观看 | 中文字幕免费播放 | 久久久久久久久久久91 | 在线免费观看视频a | 国产日韩欧美二区 | 色图av | 亚洲色成人www永久网站 | 国产精品久久毛片 | 亚洲精华液一区二区 | 亚洲国产精品久 | 国产三级三级三级三级三级 | 亚洲三级在线播放 | 亚洲国产精品va在线看黑人 | 蜜桃av噜噜一区二区三区网址 | 自慰无码一区二区三区 | 日韩 欧美 亚洲 国产 | 无码久久av一区二区三区 | 69视频在线观看 | 黑人黄色录像 | 国产亚洲自拍一区 | 日韩免费三级 | 久久青| 免费日本特黄 | 成人精品一区二区三区电影 | 欧美一区二区三区公司 | 免费观看视频在线观看 | 国产自产视频 | 亚洲精品香蕉 | 特级做a爱片免费69 少妇第一次交换又紧又爽 亚洲大胆人体 | 天堂中文在线网 | 国产精品综合久久久 | 一级免费a| www.欧美视频 | 国产色呦呦 | jizz内谢中国亚洲jizz | 首尔之春在线观看 | av资源共享| 免费天堂av | 青青射 | 深夜福利网站在线观看 | 99久久精品免费看国产免费软件 | 综合狠狠开心 | 特级丰满少妇一级aaaa爱毛片 | 国产精品久久9 | 精品一区二区精品 | 欧美7777| 少妇人妻在线视频 | 青青草手机在线视频 |