(转载请注明出处)
问! 为什么使用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
唯一觉得蛋疼的就是使用的居然不是向量,而是“模糊程度”与"角度".....我觉得使用向量更方便啊。
(撸代码过多会导致视力模糊.)
内建的实在有点多,有些实用,有些不明觉厉。可以抽空再介绍一些,暂时不再说明内建的,
毕竟强大的是自定义特效,这才是本篇的重点。
范例下载: 点击这里