Direct2D 1.1 開發筆記 特效篇(一) 使用D2D特效

(轉載請註明出處)

問! 爲什麼使用D2D 1.1版本,而不是1.0版本?

答: D2D 特效


在Direct2D 1.1 中,提供了ID2D1Effect接口,讓程序員使用硬件加速的實時特效。這幾乎就是使用D2D 1.1的絕對理由。

其他什麼 CommandList 什麼的,完全不知道嘛╮( ̄▽ ̄)╭ 

頭文件就是d2d1effects.h啥的,不過還要請鏈接"dxguid.lib"靜態庫


使用ID2D1DeviceContext::CreateEffect創建D2D特效,

使用ID2D1DeviceContext::DrawImage就可以渲染該特效。


D2D 1.1 提供了不少內建特效,比如高斯模糊什麼的。所有內建的特效在這裏

在這裏就簡單介紹幾個內建特效。


0. 總概括

輸入對象:

請看到ID2D1Effect提供的接口。

一個D2D特效需要有限自然數個輸入對象,輸入對象也可以使D2D特效(SetInputEffect),

也可以是D2D圖像比如ID2D1Bitmap1(SetInput)。

輸入0個   可以利用代碼生成圖像,比如函數圖像、高級分形圖像什麼的。

輸入1個   比如高斯模糊,讓輸入圖像模糊。大多數(大概)都是1個

輸入多個 比如將多個圖像組合到一起


控制變量。

一個特效當然需要不少個控制變量,比如這裏的高斯模糊肯定需要一個量來控制模糊程度

繼承於ID2D1Properties ,擁有SetValue與SetValueByName來設置變量。

前者使用偏移索引設置,後者使用字符串設置。話說C++沒有理由用後者啊,既有宏又有枚舉量。肯定是爲

其他語言設計的.....


特效分類:

微軟蛋疼地將特效分爲了幾類,比如濾鏡特效,高斯模糊就是濾鏡。分類不是強制的,

所以瞭解即可。


下面使用幾個內建的特效吧:

1. 高斯模糊

創建: 

m_pD2DDeviceContext->CreateEffect(CLSID_D2D1GaussianBlur, &m_pEffectTest);

CLSID_D2D1GaussianBlur是內建特效提供的GUID


設置輸入:
m_pEffectTest->SetInput(0, m_pBitmapTest);

0表示第一個輸入圖像就是m_pBitmapTest



內建的高斯模糊擁有3個控制變量,在"D2D1_GAUSSIANBLUR_PROP"枚舉類裏裏面定義。


用來動態控制程度就需要: 

m_pEffectTest->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 2.33f);

設置模糊程度爲2.33

其他兩個可以自己看看: 頭文件裏面就說得清楚


某灰鄭重警告: 擼代碼過多會導致視力模糊.


再者。我們需要動態地改變這個量。隨着時間推移改變模糊程度是一個不錯的選擇,但是這樣太

丟人了。我們可以創建一個滑塊來改變程度,但是太麻煩了。這裏直接我們直接在窗口上面點擊、滑動

即可,這樣僅僅需要處理Windows消息即可,這裏處理WM_MOUSEMOVE與WM_LBUTTONDOWN即可。


Windows消息處理不在本文範圍,詳細可以搜索。


2. 定向模糊

同理。

使用GUID: CLSID_D2D1DirectionalBlur


唯一覺得蛋疼的就是使用的居然不是向量,而是“模糊程度”與"角度".....我覺得使用向量更方便啊。


(擼代碼過多會導致視力模糊.)



內建的實在有點多,有些實用,有些不明覺厲。可以抽空再介紹一些,暫時不再說明內建的,

畢竟強大的是自定義特效,這纔是本篇的重點。



範例下載: 點擊這裏



發佈了35 篇原創文章 · 獲贊 18 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章