一、實現思路
先繪製文字陰影部分,繪製陰影文字後應用3dtransform與高斯模糊特效,最後再正常繪製一次文字主體。
二、實現**
hr = m_pdwritefactory->createtextformat(
sc_fontname,
null,
dwrite_font_weight_normal,
dwrite_font_style_normal,
dwrite_font_stretch_normal,
sc_fontsize,
l"", //locale
&ptextformat
);ptextformat->settextalignment(dwrite_text_alignment_center);
ptextformat->setparagraphalignment(dwrite_paragraph_alignment_center);
static const wchar sc_helloworld = l"你好\nworld!";
id2d1solidcolorbrush *pgraybrush = nullptr;
hr = m_poffscreenrendertarget->createsolidcolorbrush(
d2d1::colorf(d2d1::colorf::darkgray),
&pgraybrush);
hr = m_pdwritefactory->createtextlayout(
sc_helloworld,
arraysize(sc_helloworld) - 1,
ptextformat,
m_width,
m_height,
&m_ptextlayout
);m_poffscreenrendertarget->begindraw();
m_poffscreenrendertarget->clear(d2d1::colorf(1.0f, 1.0f, 1.0f, 1.0f));
m_poffscreenrendertarget->settransform(d2d1::matrix3x2f::identity());
// 繪製文字陰影部分
m_poffscreenrendertarget->drawtextlayout(d2d1::point2f(0.0f, 0.0f), m_ptextlayout, pgraybrush);
hr = m_poffscreenrendertarget->enddraw();
// 建立特效並渲染到bitmap
m_poffscreenrendertarget->queryinte***ce(&m_pdevicecontext);
m_poffscreenrendertarget->createbitmapfromwicbitmap(m_pwicbitmap, &m_pbitmap);
// 高斯模糊
m_pdevicecontext->createeffect(clsid_d2d1gaussianblur, &m_pgaussianblur);
m_pgaussianblur->setinput(0, m_pbitmap);
m_pgaussianblur->setvalue(d2d1_gaussianblur_prop_border_mode, d2d1_border_mode_soft);
m_pgaussianblur->setvalue(d2d1_gaussianblur_prop_standard_deviation, 1.0f);
// 映象陰影
id2d1effect *pperspectivetransformeffect = nullptr;
m_pdevicecontext->createeffect(clsid_d2d13dperspectivetransform, &pperspectivetransformeffect);
pperspectivetransformeffect->setinputeffect(0, m_pgaussianblur);
pperspectivetransformeffect->setvalue(d2d1_3dperspectivetransform_prop_rotation_origin,
d2d1::vector3f(m_width / 2.0f, m_height / 2.0f, 0.0f));
pperspectivetransformeffect->setvalue(d2d1_3dperspectivetransform_prop_rotation,
d2d1::vector3f(180.0f, 0.0f, 0.0f));
pperspectivetransformeffect->setvalue(d2d1_3dperspectivetransform_prop_global_offset,
d2d1::vector3f(0.0f, sc_fontsize * gettextlines(sc_helloworld), 0.0f));
m_pdevicecontext->begindraw();
m_pdevicecontext->clear(d2d1::colorf(1.0f, 1.0f, 1.0f, 1.0f));
m_pdevicecontext->settransform(d2d1::matrix3x2f::identity());
m_pdevicecontext->drawimage(pperspectivetransformeffect, d2d1_interpolation_mode_linear);
hr = m_pdevicecontext->enddraw();
// 繪製文字本體部分
if (succeeded(hr))
三、繪製結果1、單行文字:
2、多行文字
四、總結
1、整個實現過程包含了三次繪製,第一次繪製的文字是為後面應用特效做準備的,第二次繪製應用了高斯模糊和3d變換,將第一次繪製的文字變換為映象陰影的效果,最後一次是正常繪製文字主體。
2、在對原文本進行3d變換的時候,這裡先對文字繞x軸旋轉180度,然後向下偏移n * fontsize,n為文字中包含的行數。
3、上面的實現方法只能將文字整體進行映象處理,沒法實現每一行文字單獨映象。如果要實現每行單獨映象,自己的思路是單獨繪製每一行的文字,然後應用上面的方法繪製對應的陰影,重複上述過程,直到繪製完所有的文字。
ps:本文**是基於微軟官方文件示例實現的,詳情可參考這裡。
Direct2D 快速入門
本文為msdn direct2d 部分譯文,歡迎指點!原文 direct2d 是用於建立2d圖形的本地即時模式應用程式介面。本文介紹如何在典型的win32應用程式中運用direct2d進行繪製。switch message return 0 處理其它訊息.要用 gdi 繪製乙個矩形,需要捕獲 wm ...
Direct2D 學習筆記
direct2d 以下簡稱d2d 是乙個 使用者模式的庫,基於 d3d 10.1 api 從 win8開始,d2d 基於 d3d 11.1 所以 d2d 可以提供 gpu 硬體加速。d2d架構圖 第一步 標頭檔案 include第二步 建立乙個 id2d1 工廠 1 id2d1factory m p...
Direct2D 中層概述
物件表示,它使應用程式可以操作一組繪製操作。可通過將層 壓入 呈現器目標的方式來使用層。呈現器目標執行的後續繪製操作將被指引到壓入的層。在處理完該層之後,可從呈現器目標 彈出 該層,這可將該層的內容重新復合到呈現器目標中。雖然層提供了一種用於產生有趣效果的強大呈現方法,但在應用程式中過多使用層可能會...