(转载请注明出处)
这次我们实现一个自定义的转变。
实现Direct2D 自定义转变Shader Models需要HLSL(High Level Shading Language)的实现。
HLSL是Shader的一种实现,但是HLSL只能在D3D中使用,所以有点蛋疼。
Shader被描述为显卡执行的小段程序,能够高效(并行)地执行。
没学过?没关系,笔者也没有,但是详细的不会在这里说明(你TM逗我(╯‵□′)╯︵┴─┴),请到官网中看看。
D2D 特效能用 HLSL 的 4.0 及其以上版本(Shader Models 4.0),这是在D3D 10中实现的。
但是我们为了编程的方便,强行要求显卡支持D3D11,毕竟笔者的破集成显卡都支持D3D11。
D2D 特效能够使用的着色器有: 像素着色器,顶点着色器与计算着色器。
这次的主题就是写一个简单的像素着色器转变——反相,就是将颜色反转过来。
想想若是CPU执行,先是需要将几兆的数据翻转过来,再送到显卡显示,效率堪忧。
先看看D3D11 的渲染管线吧。
当然D2D没有这么复杂,光栅化也简单,毕竟是2D。
这个管线看看就行,除非你开发D3D11程序,D2D特效只需了解即可——像素着色器是几个操作最后一步(除了OM输出)
实现D2D像素着色器特效,需要实现ID2D1DrawTransform,查看头文件会发现:
ID2D1DrawTransform-----继承于---->ID2D1Transform-----继承于---->ID2D1TransformNode-----继承于---->IUnknown
而ID2D1TransformNode就是我们上一节中提到的"转变节点",什么AddNode、SetOutputNode的