Direct2D實現文字映象陰影

2021-09-09 09:26:41 字數 3442 閱讀 8805

一、實現思路

先繪製文字陰影部分,繪製陰影文字後應用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 中層概述

物件表示,它使應用程式可以操作一組繪製操作。可通過將層 壓入 呈現器目標的方式來使用層。呈現器目標執行的後續繪製操作將被指引到壓入的層。在處理完該層之後,可從呈現器目標 彈出 該層,這可將該層的內容重新復合到呈現器目標中。雖然層提供了一種用於產生有趣效果的強大呈現方法,但在應用程式中過多使用層可能會...