(2020年整理)Direct2D教程.pptx

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

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

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

2、于Direct3D 所以能够使用硬件加速功能 能更大程度的发挥硬件特性 创建高性能 高质量的2D图形 这些图形包括几何图形 如矩形 椭圆等 还有位图 文本 而且更方便的是 Direct2D与GDI GDI 和D3D都是可以交互的 运行需求 要开发和使用Direct2D程序 系统必须是Windows7 WindowsVistaSP2 WindowsServer2008R2或者WindowsServer2008SP2 这样的系统需求无疑会稍稍阻碍Direct2D前进的步伐 虽然Vista和Windows7已经推出有一段时间了 但是不可否认的是 仍然有很多人在使用XP系统 甚至是Win2K 但是新技

3、术的普及是不可阻碍的 相信不久的将来 Direct2D将会成为2D图形世界的主流 D2D的架构 学海无涯Direct2D是基于Direct3D10 1API构建的 这意味着Direct2D可以使用硬件加速 下图是Direct2D与Direct3D的一个关系图 由上图可以看出 Direct2D还自带了一个软件实现 Softwarerasterizer 这是因为如果显卡不支持硬件加速 那么Direct2D可以使用软件方式渲染 即使这样 效果还是要优于GDI的 上图中在Direct3D下面还有一个层叫DXGI 其全称是 DirectXGraphicsInfrastructure DXGI从Direc

4、t3D10中才开始存在 主要是为了将一些与3D图形无关的工作从原本的runtime中分离处理 这些工作多是一些底层的操作 比如枚举设备 显示帧缓冲 gamma控制 管理全屏等 在Direct3D10以前的版本中 这些操作全部集成到了Direct3D的API中 现在分离处理单独成为一个component 就是DXGI 可视效果 使用Direct2D可以获得比GDI更加优秀的可视效果 Direct2D支持基于图元的抗锯齿效果 而且完全支持透明和Alpha混合 下图是GDI和Direct2D的一个比较 大家可以看一下 Direct2D的细腻程度可见一斑 学海无涯 可交互性 Direct2D与Dire

5、ct3D GDI GDI 都有着良好的交互性 因为他们都支持表面级别的操作 这里的表面在Direct3D中就是surface 而在GDI中则相当于DC DeviceContext 此外Direct2D还能很好的支持DirectWrite DirectWrite也是DirectX中一个新的Feature 主要用来做文本的绘制 下图是这几者指间的关系 学海无涯 期待 虽然Direct2D有着明显的优势 但是想取代GDI仍然非短时间可以达到 为了保持向后兼容 微软在短时间内绝不会放弃GDI 如今Direct2D出世已经有一段时间了 GDI还有多少时间 对于Windows平台上的图形世界 Direct

6、X一统江湖的日子还有多远 我们拭目以待 引子 学海无涯任何一门语言的第一个教程几乎都是Hello world 我们也不例外 但是这里不是教大家打印Hello world 而是编写一个简单的D2D绘制程序 让大家对Direct2D的程序结构及编程方法有一个基本的认识 下面我们来看如何一步一步绘制一个矩形 基本概念 在开始之前 还是先介绍一些基本的概念 有助于大家理解程序 这些概念包括 Brush 画刷 Rendertarget 渲染目标 Geometry 几何图形 它们会贯穿整个教程 所以越早介绍越好 对于有WindowsGDI基础的人来说 理解这些概念很容易 没有基础的也没关系 我们可以先了解

7、一下 随着学习的深入 会有更加深刻的认识 Brush Brush 画刷 画刷是绘图的工具 它管理图形的颜色 虚实 画刷可以绘制几何图形 也可以绘制位图 Rendertarget Rendertarget 渲染目标 姑且这么翻译吧 是绘制的场所 其实这就是一个surface 一个表面 再具体点就是一块内存 可以是显存 也可能是系统内存 所有的绘图操作都在这里完成 Geometry Bitmap Text Geometry 几何图形 Bitmap 位图 Text 文本 这三者是要绘制的内容 几何图形包括矩形 圆角矩形 椭圆等 当然Direct2D除了可以绘制几何图形之外 还可绘制位图和文本 D2D

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

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

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

11、rect2D的渲染时机与D3D有些不同 D3D是在没有消息处理时进行渲染 而D2D则是响应WM PAINT消息进行渲染 下面的代码中会有详细的解释 代码 添加头文件 学海无涯除了Win32编程需要的头文件 比如Windows h 之外 任何D2D程序都需要头文件d2d1 h include include 声明全局变量 首先我们需要一个ID2D1Factory 类型的对象 也就是D2D工厂接口 这个接口是所有D2D程序的起始点 几乎所有的D2D资源都是由这个接口创建的 其次我们需要一个渲染的场所 也就是RenderTarget 在D2D中有多种类型的RenderTarget 这里我们选择ID2

12、D1HwndRenderTarget类型 用来在窗口中进行渲染 最后我们定义一个画刷 用来绘制图形 这里选择固定颜色的画刷 即ID2D1SolidColorBrush ID2D1Factory pD2DFactory NULL Direct2DfactoryID2D1HwndRenderTarget pRenderTarget NULL RendertargetID2D1SolidColorBrush pBlackBrush NULL Ablackbrush reflectthelinecolorRECTrc RenderareaHWNDg Hwnd Windowhandle 创建D2D工厂

13、接下来创建D2D工厂对象 有了这个对象才能创建后续的资源 这个函数有两个参数 第一个参数是工厂的类型 这里只有单线程和多线程两类 如果是单线程的话 意味着D2D不会为所创建的工厂的对象以及由这个对象创建的子对象提供同步机制 也就是说 如果有多个线程访问了这个资源 那么需要自己提供同步机制 如果是多线程类型 那么D2D会为你提供同步机制 第二个参数用来接收创建的工厂 HRESULThr 学海无涯hr D2D1CreateFactory D2D1 FACTORY TYPE SINGLE THREADED 创建Rendertarget 有了工厂对象以后 开始创建RenderTarget Create

14、HwndRenderTarget函数有三个参数 第一个参数是Rendertarget属性 包括渲染模式 象素格式 DPI等 D2D提供了一个函数D2D1 RenderTargetProperties 可以用来生成默认的属性 我们这里直接使用这个函数 第二个参数是Hwnd类型的Rendertarget属性 它包含三个参数 第一个是窗口句柄 第二个是Rendertarget的大小 第三个参数是Present选项 这个参数有个默认值 这里我们使用它的默认值 CreateHwndRenderTarget函数的最后一个参数用来接收创建的Rendertarget CreateaDirect2Drender

15、targethr pD2DFactory CreateHwndRenderTarget D2D1 RenderTargetProperties D2D1 HwndRenderTargetProperties hWnd D2D1 SizeU rc right rc left rc bottom rc top 创建画刷 学海无涯有了Rendertarget 再使用函数CreateSolidColorBrush创建画刷 这里创建一个固定颜色的画刷 第一个参数是画刷的颜色 第二个参数接收创建的画刷 画刷的颜色就是绘制线条所用的颜色 比如这里创建一个红色的画刷 那么后面绘制的矩形就是红色的 Create

16、abrushhr pRenderTarget CreateSolidColorBrush D2D1 ColorF D2D1 ColorF Red 绘制矩形 万事俱备 只欠渲染 渲染的代码很简单 首先调用CreateD2DResource函数来创建资源 这是个自定义函数 用来创建资源 比如Rendertarget 画刷之类的 该函数包含了上面提到的代码 绘制的代码要放在BeginDraw和EndDraw函数之间 调用Clear函数可以将Rendertarget清除为指定的背景色 DrawRectangle函数用来绘制矩形 它有两个参数 第一个是被绘制的矩形 第二个是绘制所用的画刷 函数EndDraw的返回值标识了渲染是否成功 VOIDDrawRectangle CreateD2DResource g Hwnd pRenderTarget BeginDraw Clearbackgroundcolorwhite 学海无涯pRenderTarget Clear D2D1 ColorF D2D1 ColorF White DrawRectanglepRenderTarget DrawRectan

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

当前位置:首页 > 办公文档 > 心得体会

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