(轉載請註明出處)
問! 爲什麼使用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
唯一覺得蛋疼的就是使用的居然不是向量,而是“模糊程度”與"角度".....我覺得使用向量更方便啊。
(擼代碼過多會導致視力模糊.)
內建的實在有點多,有些實用,有些不明覺厲。可以抽空再介紹一些,暫時不再說明內建的,
畢竟強大的是自定義特效,這纔是本篇的重點。
範例下載: 點擊這裏