首页 > 代码库 > Direct2D 1.1 开发笔记 特效篇(一) 使用D2D特效

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


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


(撸代码过多会导致视力模糊.)



内建的实在有点多,有些实用,有些不明觉厉。可以抽空再介绍一些,暂时不再说明内建的,

毕竟强大的是自定义特效,这才是本篇的重点。



范例下载: 点击这里



Direct2D 1.1 开发笔记 特效篇(一) 使用D2D特效