2020年整理Direct2D教程.pdf

上传人:摩西的****12 文档编号:132897557 上传时间:2020-05-21 格式:PDF 页数:93 大小:1.26MB
返回 下载 相关 举报
2020年整理Direct2D教程.pdf_第1页
第1页 / 共93页
2020年整理Direct2D教程.pdf_第2页
第2页 / 共93页
2020年整理Direct2D教程.pdf_第3页
第3页 / 共93页
2020年整理Direct2D教程.pdf_第4页
第4页 / 共93页
2020年整理Direct2D教程.pdf_第5页
第5页 / 共93页
亲,该文档总共93页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《2020年整理Direct2D教程.pdf》由会员分享,可在线阅读,更多相关《2020年整理Direct2D教程.pdf(93页珍藏版)》请在金锄头文库上搜索。

1、学 海 无 涯 什么是什么是 Direct2DDirect2D 一言以蔽之 就是 Windows 7 平台上的一个 2D 图形 API 可以提供高性能 高 质量的 2D 渲染 大多数人对 Direct2D 可能都比较陌生 以至于我之前在论坛上 提到这个词的时候 有人竟然说你是不是写错了 可能大家比较熟悉的是 Direct3D 因为 D3D 已经是当前游戏界的主流应用 在过去 3D 世界是 OpenGL 与 DirectX 二分天下 但是由于 OpenGL 发展十分滞后 而且没有一个像微软这样 强大的后台支柱 所以逐渐被 DirectX 所超越 回过头来说 2D 过去 Windows 上的2D程

2、序还主要基于GDI和GDI 遗憾的是这两者都是软件实现 而Direct2D 则不同 它基于 Direct3D 所以能够使用硬件加速功能 能更大程度的发挥硬 件特性 创建高性能 高质量的 2D 图形 这些图形包括几何图形 如矩形 椭 圆等 还有位图 文本 而且更方便的是 Direct2D 与 GDI GDI 和 D3D 都是可 以交互的 运行需求运行需求 要开发和使用 Direct2D 程序 系统必须是 Windows 7 Windows Vista SP2 Windows Server 2008 R2 或者 Windows Server 2008 SP2 这样的系统需求无疑 会稍稍阻碍 Dir

3、ect2D 前进的步伐 虽然 Vista 和 Windows 7 已经推出有一段时 间了 但是不可否认的是 仍然有很多人在使用 XP 系统 甚至是 Win2K 但是 新技术的普及是不可阻碍的 相信不久的将来 Direct2D 将会成为 2D 图形世界 的主流 D2DD2D 的架构的架构 学 海 无 涯 Direct2D 是基于 Direct3D 10 1 API 构建的 这意味着 Direct2D 可以使用硬件 加速 下图是 Direct2D 与 Direct3D 的一个关系图 由上图可以看出 Direct2D 还自带了一个软件实现 Software rasterizer 这是因为如果显卡不支

4、持硬件加速 那么 Direct2D 可以使用软件方式渲染 即 使这样 效果还是要优于 GDI 的 上图中在 Direct3D 下面还有一个层叫 DXGI 其全称是 DirectX Graphics Infrastructure DXGI 从 Direct3D 10 中才开始 存在 主要是为了将一些与 3D 图形无关的工作从原本的 runtime 中分离处理 这些工作多是一些底层的操作 比如枚举设备 显示帧缓冲 gamma 控制 管理 全屏等 在 Direct3D 10 以前的版本中 这些操作全部集成到了 Direct3D 的 API 中 现在分离处理单独成为一个 component 就是 DX

5、GI 可视效果可视效果 使用 Direct2D 可以获得比 GDI 更加优秀的可视效果 Direct2D 支持基于图元的 抗锯齿效果 而且完全支持透明和 Alpha 混合 下图是 GDI 和 Direct2D 的一个 比较 大家可以看一下 Direct2D 的细腻程度可见一斑 学 海 无 涯 可交互性可交互性 Direct2D 与 Direct3D GDI GDI 都有着良好的交互性 因为他们都支持表面级别 的操作 这里的表面在Direct3D中就是surface 而在GDI中则相当于DC Device Context 此外 Direct2D 还能很好的支持 DirectWrite Direc

6、tWrite 也是 DirectX 中一个新的 Feature 主要用来做文本的绘制 下图是这几者指间的关 系 学 海 无 涯 期待期待 虽然 Direct2D 有着明显的优势 但是想取代 GDI 仍然非短时间可以达到 为了 保持向后兼容 微软在短时间内绝不会放弃 GDI 如今 Direct2D 出世已经有一 段时间了 GDI 还有多少时间 对于 Windows 平台上的图形世界 DirectX 一统 江湖的日子还有多远 我们拭目以待 引子引子 学 海 无 涯 任何一门语言的第一个教程几乎都是 Hello world 我们也不例外 但是 这里不是教大家打印 Hello world 而是编写一个

7、简单的 D2D 绘制程序 让大家对 Direct2D 的程序结构及编程方法有一个基本的认识 下面我们来 看如何一步一步绘制一个矩形 基本概念基本概念 在开始之前 还是先介绍一些基本的概念 有助于大家理解程序 这些概 念包括 Brush 画刷 Render target 渲染目标 Geometry 几何 图形 它们会贯穿整个教程 所以越早介绍越好 对于有 Windows GDI 基础的人来说 理解这些概念很容易 没有基础的也没关系 我们可以先 了解一下 随着学习的深入 会有更加深刻的认识 BrushBrush Brush 画刷 画刷是绘图的工具 它管理图形的颜色 虚实 画刷可以绘 制几何图形 也

8、可以绘制位图 Render targetRender target Render target 渲染目标 姑且这么翻译吧 是绘制的场所 其实这就是 一个 surface 一个表面 再具体点就是一块内存 可以是显存 也可能是 系统内存 所有的绘图操作都在这里完成 Geometry Bitmap TextGeometry Bitmap Text Geometry 几何图形 Bitmap 位图 Text 文本 这三者是要绘制的内容 几何图形包括矩形 圆角矩形 椭圆等 当然 Direct2D 除了可以绘制几何 图形之外 还可绘制位图和文本 D2D 没有提供加载位图的接口 所以对位 学 海 无 涯 图的

9、加载都是使用 WIC 来实现的 而对文本的绘制则是通过 DirectWrite 来实现的 DirectWrite 在分类上属于 D2D 但是目前已经独立成一个组件 了 为了便于理解以上三者之间的关系 大家可以想象一个画家 他在作 画的时候 都需要那些东西呢 第一 他需要一支画笔用来绘制 这相当 于上面的画刷 第二 他需要一张纸或者一张画布用来承载绘制的东西 这就是上面的 Render target 最后 他想画什么呢 山水 花鸟 亦或是 人物 这就是绘制的内容 相当于上面的几何图形 位图或者文本 ResourceResource 在 Direct2D 中主要有两种资源 一是设备无关的资源 另一

10、个是设备相关 的资源 所谓设备无关 是指该资源不与特定的硬件渲染设备相关联 所 以设备无关的资源都分配在 CPU 中 而设备相关是指该资源与特定的渲染 硬件相关联 比如当硬件加速可用时 使用 GPU 渲染 否则使用 CPU 渲染 设备无关的资源 ID2D1DrawingStateBlock ID2D1Factory ID2D1Geometry 及继承自它的接口 ID2D1GeometrySink 和 ID2D1SimplifiedGeometrySink ID2D1StrokeStyle 除了 ID2D1RenderTarget 之外 所有使用 ID2D1Factory 创建的资源都是设 备无

11、关的 设备相关的资源 ID2D1Brush 及继承自它的接口 学 海 无 涯 ID2D1Layer ID2D1RenderTarget 及继承自它的接口 一般来说 使用 ID2D1RenderTarget 创建的资源都是设备相关的 程程序序框架框架 一个简单的 D2D 程序大致包含下面三个核心函数 1 创建资源 Create Resources 设备无关的资源可以一次性创建 永 久使用 而设备相关的资源则需要随着设备改变而相应的改变 2 渲染 Render 响应 WM PAINT 消息进行绘制 3 清理资源 Cleanup DX 是基于 COM 的 所有 COM 对象在使用完毕时 都要释放 为

12、了便于大家理解 我画了一张图 这个图简单描述了 D2D 程序的基本渲 染流程 学 海 无 涯 需要说明的是 Direct2D 的渲染时机与 D3D 有些不同 D3D 是在没有消息 处理时进行渲染 而 D2D 则是响应 WM PAINT 消息进行渲染 下面的代码中 会有详细的解释 代码代码 添加头文件添加头文件 学 海 无 涯 除了 Win32 编程需要的头文件 比如 Windows h 之外 任何 D2D 程序都需 要头文件 d2d1 h include include 声明全局变量声明全局变量 首先我们需要一个 ID2D1Factory 类型的对象 也就是 D2D 工厂接口 这个 接口是所有

13、 D2D 程序的起始点 几乎所有的 D2D 资源都是由这个接口创建 的 其次我们需要一个渲染的场所 也就是 Render Target 在 D2D 中有多 种类型的 Render Target 这里我们选择 ID2D1HwndRenderTarget 类型 用 来在窗口中进行渲染 最后我们定义一个画刷 用来绘制图形 这里选择 固定颜色的画刷 即 ID2D1SolidColorBrush ID2D1Factory pD2DFactory NULL Direct2D factory ID2D1HwndRenderTarget pRenderTarget NULL Render target ID2

14、D1SolidColorBrush pBlackBrush NULL A black brush reflect the line color RECT rc Render area HWND g Hwnd Window handle 创建创建 D2DD2D 工厂工厂 接下来创建 D2D 工厂对象 有了这个对象才能创建后续的资源 这个函数 有两个参数 第一个参数是工厂的类型 这里只有单线程和多线程两类 如果是单线程的话 意味着 D2D 不会为所创建的工厂的对象以及由这个对 象创建的子对象提供同步机制 也就是说 如果有多个线程访问了这个资 源 那么需要自己提供同步机制 如果是多线程类型 那么 D

15、2D 会为你提 供同步机制 第二个参数用来接收创建的工厂 HRESULT hr 学 海 无 涯 hr D2D1CreateFactory D2D1 FACTORY TYPE SINGLE THREADED if FAILED hr MessageBox hWnd Create D2D factory failed Error 0 return 创建创建 Render targetRender target 有了工厂对象以后 开始创建 RenderTarget CreateHwndRenderTarget 函 数有三个参数 第一个参数是 Render target 属性 包括渲染模式 象素 格式

16、 DPI 等 D2D 提供了一个函数 D2D1 RenderTargetProperties 可 以用来生成默认的属性 我们这里直接使用这个函数 第二个参数是 Hwnd 类型的 Render target 属性 它包含三个参数 第一个是窗口句柄 第二 个是 Render target 的大小 第三个参数是 Present 选项 这个参数有个 默认值 这里我们使用它的默认值 CreateHwndRenderTarget 函数的最后 一个参数用来接收创建的 Render target Create a Direct2D render target hr pD2DFactory CreateHwndRenderTarget D2D1 RenderTargetProperties D2D1 HwndRenderTargetProperties hWnd D2D1 SizeU rc right rc left rc bottom rc top if FAILED hr MessageBox hWnd Create render target failed Error 0 return 创建画刷创

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号