关于Direct2D

2023-05-16

㈠ 关于Direct2D

    Direct2D是一个硬件加速的,提供立即模式的二维图形API。它提供了二维的几何体,位图,文本的高性能,高质量的渲染恶魔。十分方便的是,Direct2D与GDI,GDI+和D3D都是可以交互的。一项技术总是有其受众面,看看微软本身怎么说的灯泡

  • 大型企业级本机应用程序开发人员。
  • 创建供下游开发人员使用的控件工具包和库的开发人员。
  • 需要对二维图形进行服务器端呈现的开发人员。
  • 使用 Direct3D 图形,并且需要在菜单、用户界面 (UI) 元素和抬头显示器 (HUD) 中使用高性能的简单二维和文本呈现的开发人员。

㈡ Direct2D的架构

    Direct2D是基于使用Direct3D 10.1的API太阳,所以Direct2D的应用可以再渲染的时候受益于显卡的硬件加速。以下是其架构图,来源于Direct2D的document:

N$H}1[T4P1V2X{@7}27GJ}T

    在Direct2D的右下方,有一个软件光栅化(software rasterizer),假如显卡不支持硬件加速,那么Direct2D可以使用软件方式渲染,即便是这样,其效果还是要优于GDI的吐舌笑脸。在Direct 3D下面还有一层叫DXGI(DirectX Graphics Infrastructure (DXGI) ),对于DXGI,现在我还不是很了解,这里就不敢乱说了尴尬。抱歉抱歉。。

㈢ 视觉效果

    使用Direct2D渲染出来的效果要比GDI要好的多。因为Direct2D使用基于图元的反锯齿效果(这样会使线条更加的平滑),而且在渲染二维图元的时候,完全支持透明和alpha混合。以下是对比的照片:

_8TNDIII[(Y9ALE6)Q6PCPH

    两者的对比很明显吧!显然,右边的Direct2D的线条效果要好于左边的GDI。

㈢ 交互性

    介绍交互性,先看看下面这张图太阳

LYG0P)@L%9ZZZ)4`0`@X2}B

    此张图介绍了Direct2D与Direct3D,GDI+,GDI,DirectWrite,Windows Imaging Component (WIC)的交互性。在这张图中列出了与各个不同的平台交互的函数。虽然对其中的某些平台不了解,但看起来好像很厉害的样子尴尬

㈣ Direct2D的Hello World

⑴ Direct2D的头文件

    Direct2D API定义于以下头文件中:

头文件

描述

d2d1.h 定义了主要的Direct2D API
d2d1helper.h 定义了C++帮助函数,类和结构
d2dbasetypes.h 定义了Direct2D的主要绘图,例如:点,矩形等。其头文件也包含在d2d1.h之中。
d2derr.h 定义了异常代码在Direct2D中。其头文件也包含在d2d1.h之中。

    除了包含这些头文件,还有包含灯泡d2d1.lib这个库。你可以在Windows Software Development Kit (SDK) for Windows 7中可以找到以上这些东西。

⑵ 基本术语解释

① Direct2D Resources(资源)

    所谓的资源,指的是视频内存或系统内存的某种分配。举例来说,位图和画笔就是资源。Direct2D提供了更直接的映射来充分利用 GPU。它提供了两类资源:与设备无关的资源和与设备有关的资源。(以下两部分内容来自msdn上的解释书呆子

   ⅰ 与设备无关的资源(如 ID2D1Geometry)保留在 CPU 上。

  • ID2D1DrawingStateBlock
  • ID2D1Factory
  • ID2D1Geometry 以及从其继承的接口。
  • ID2D1GeometrySink 和 ID2D1SimplifiedGeometrySink
  • ID2D1StrokeStyle

   ⅱ 与设备有关的资源(如 ID2D1RenderTarget 和 ID2D1LinearGradientBrush)直接映射到 GPU 上的资源(如果硬件加速可用)。通过将来自几何对象的顶点和覆盖信息与由与设备有关的资源生成的纹理信息进行组合,来执行呈现调用。

  • ID2D1Brush 以及从其继承的接口。使用呈现器目标可创建画笔。
  • ID2D1Layer 使用呈现器目标可创建层。
  • ID2D1RenderTarget 以及从其继承的接口。若要创建呈现器目标,请使用工厂或其他呈现器目标。

② RenderTarget(渲染目标)

    渲染目标是从ID2D1RenderTarget 接口继承的资源。其用于创建绘制的资源,并执行实际的绘制操作。你可以通过以下方式使用多种类型的渲染目标来呈现图形:。(以下部分内容来自msdn上的解释书呆子

  • ID2D1HwndRenderTarget 对象将内容呈现到窗口。
  • ID2D1DCRenderTarget 对象呈现到 GDI 设备上下文。
  • 位图呈现器目标对象将内容呈现到屏幕外位图。
  • DXGI 呈现器目标对象呈现到用于 Direct3D 的 DXGI 图面。

③ Brush(画笔)

    画笔用其输出来“绘制”区域,不同的画笔具有不同的输出类型。Direct2D 提供了四种画笔:。(以下部分内容来自msdn上的解释书呆子

  • ID2D1SolidColorBrush 用纯色绘制区域
  • ID2D1LinearGradientBrush 用线性渐变绘制区域
  • ID2D1RadialGradientBrush 用径向渐变绘制区域
  • ID2D1BitmapBrush 用位图绘制区域

544A~@9H8U2GYCCW~2TUL)C

④ ID2D1Geometry(几何对象)

    Direct2D 几何对象是由 ID2D1Factory 创建的与设备无关的不可变资源。其对象可以是简单几何对象(ID2D1RectangleGeometry、ID2D1RoundedRectangleGeometry 或 ID2D1EllipseGeometry)、路径几何对象 (ID2D1PathGeometry) 或复合几何对象(ID2D1GeometryGroup 和ID2D1TransformedGeometry)。

⑤ Bitmap(位图)

    Direct2D 不提供用于加载或存储位图的方法;而是使您可以使用 Windows 图像处理组件 (WIC) 创建位图。位图资源可以使用 WIC 进行加载,然后通过 ID2D1RenderTarget::CreateBitmapFromWicBitmap 方法用于创建 ID2D1Bitmap。

⑶ Hello World来了大笑,创建一个矩形!

① 包含 Direct2D 头文件


// windows的头文件  

#include <windows.h>  

   

// Direct2D的头文件  

#include <d2d1.h>  

② 创建一个ID2D1Factory

    ID2D1Factory是使用 Direct2D 的起点,使用 ID2D1Factory 可创建 Direct2D 资源。


ID2D1Factory* pd2dfactory = null;  

HRESULT hr = D2D1CreateFactory(  

                D2D1_FACTORY_TYPE_SINGLE_THREADED,  

                &pd2dfactory  

                );  

③ 创建 ID2D1HwndRenderTarget

    创建工厂之后,我们要创建渲染目标。具体见下面的代码:


HRESULT hr = S_OK;  

   

if (!m_pRenderTarget)  

{  

    RECT rc;  

    GetClientRect(m_hwnd, &rc);  

   

    D2D1_SIZE_U size = D2D1::SizeU(  

        rc.right - rc.left,  

        rc.bottom - rc.top  

        );  

   

    // 创建一个Direct2D渲染目标,m_pRenderTarget这是我们要创建的。  

    hr = m_pDirect2dFactory->CreateHwndRenderTarget(  

        D2D1::RenderTargetProperties(),  

        D2D1::HwndRenderTargetProperties(m_hwnd, size),  

        &m_pRenderTarget  

        );  

   

    if (SUCCEEDED(hr))  

    {  

        // 创建一个灰色的画笔,调用的是CreateSolidColorBrush函数,LightSlateGray这是笔的颜色  

        hr = m_pRenderTarget->CreateSolidColorBrush(  

            D2D1::ColorF(D2D1::ColorF::LightSlateGray),  

            &m_pLightSlateGrayBrush      

            );  

    }  

    if (SUCCEEDED(hr))  

    {  

        // 创建一个蓝色的画笔  

            hr = m_pRenderTarget->CreateSolidColorBrush(  

            D2D1::ColorF(D2D1::ColorF::CornflowerBlue),  

            &m_pCornflowerBlueBrush  

            );  

    }  

}  

④ 绘制矩形


HRESULT hr = S_OK;  

   

hr = CreateDeviceResources();    // 创建好了m_pRenderTarget  

   

if (SUCCEEDED(hr))  

{  

    m_pRenderTarget->BeginDraw();    // 绘制就在BeginDraw()和EndDraw()之间  

   

    m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());      

   

    m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue));    // 背景颜色  

   

    D2D1_SIZE_F rtSize = m_pRenderTarget->GetSize();  

   

    // 绘制一个网格背景  

    int width = static_cast<int>(rtSize.width);  

    int height = static_cast<int>(rtSize.height);  

   

    for (int x = 0; x < width; x += 10)  

    {  

        m_pRenderTarget->DrawLine(  

            D2D1::Point2F(static_cast<FLOAT>(x), 0.0f),  

            D2D1::Point2F(static_cast<FLOAT>(x), rtSize.height),  

            m_pLightSlateGrayBrush,  

            0.5f  

            );  

    }  

   

    for (int y = 0; y < height; y += 10)  

    {  

        m_pRenderTarget->DrawLine(  

            D2D1::Point2F(0.0f, static_cast<FLOAT>(y)),  

            D2D1::Point2F(rtSize.width, static_cast<FLOAT>(y)),  

            m_pLightSlateGrayBrush,  

            0.5f  

            );  

    }  

   

    //绘制两个矩形  

    D2D1_RECT_F rectangle1 = D2D1::RectF(  

        rtSize.width/2 - 50.0f,  

        rtSize.height/2 - 50.0f,  

        rtSize.width/2 + 50.0f,  

        rtSize.height/2 + 50.0f  

        );  

   

    D2D1_RECT_F rectangle2 = D2D1::RectF(  

        rtSize.width/2 - 100.0f,  

        rtSize.height/2 - 100.0f,  

        rtSize.width/2 + 100.0f,  

        rtSize.height/2 + 100.0f  

        );  

   

   

    // 绘制一个实心的矩形  

    m_pRenderTarget->FillRectangle(&rectangle1, m_pLightSlateGrayBrush);  

   

    // 绘制一个空心的矩形  

    m_pRenderTarget->DrawRectangle(&rectangle2, m_pCornflowerBlueBrush);  

   

    // 结束绘制  

    hr = m_pRenderTarget->EndDraw();  

}  

   

if (hr == D2DERR_RECREATE_TARGET)  

{  

    hr = S_OK;  

    DiscardDeviceResources();    // 释放资源  

}  

⑤ 释放资源


template<class Interface>  

inline void SafeRelease(  

    Interface **ppInterfaceToRelease  

    )  

{  

    if (*ppInterfaceToRelease != NULL)  

    {  

        (*ppInterfaceToRelease)->Release();  

   

        (*ppInterfaceToRelease) = NULL;  

    }  

}  

   

// 上面是释放函数,下面是释放的对象!  

SafeRelease(&m_pRenderTarget);  

SafeRelease(&m_pLightSlateGrayBrush);  

SafeRelease(&m_pCornflowerBlueBrush);  

    这是执行的结果灯泡

OR9XOPMWGYJN7ID0TQ7OIRC

    弄了两天才写好,上面的有些东西也不是特别了解,请见谅!但是应该会随着时间的推移,了解更深的。如果大牛们看到其中的不足,请大牛们指正,本人不甚感激大笑

 

参考文献

1. msdn文档:http://msdn.microsoft.com/zh-cn/library/dd370990(v=vs.85).aspx

2.还是msdn文档。。。。因为本文是基于文档写成的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Direct2D 的相关文章

  • c++用WinForm做界面的实现

    以前是做C 的 xff0c 对Winform情有独钟 xff0c 最近想转C 43 43 想把以前的一些Delphi转成c 43 43 xff0c MFC我不熟而且用起来相当烦效果又丑 xff0c GTK图形库用起来太麻烦 xff0c 琢磨
  • MFC中绘制动态曲线

    在工控监测领域 xff0c 经常需要动态绘制曲线 xff0c 观察曲线的变化趋势 xff0c 绘制波形图 xff0c 绘制频谱等 在前面4讲中介绍了MFC经常用的 TeeChart 控件和 Hight Speed Chart Ctrl xf
  • c++ 如何获取系统时间

    DoubleSnake 转载http blog csdn net zjnig711 article details 2419081 c 43 43 如何获取系统时间 2008 04 28 15 34 方案 优点 xff1a 仅使用C标准库

随机推荐

  • Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.... 此错误的解

    调用DLL里的函数 或 类成员函数 碰到此错误 xff1a Run Time Check Failure 0 The value of ESP was not properly saved across a function call Th
  • dll动态库调用约定

    1 动态链接库英文为DLL xff0c 是Dynamic Link Library 的缩写形式 xff0c DLL是一个包含可由多个程序同时使用的代码和数据的库 xff0c DLL不是可执行文件 动态链接提供了一种方法 xff0c 使进程可
  • C++ 事件编程

    43 43 事件编程 在微软 NET 框架中可以定义托管类事件并用委托和 43 61 操作符处理这些事件 这种机制似乎很有用 xff0c 那么在本机 C 43 43 中有没有办法做同样的事情 xff1f Several Readers 确实
  • 回调函数是什么

    回调函数 程序员常常需要实现回调 本文将讨论 函数指针的基本原则并说明如何使用函数指针实现回调 注意这里针对的是普通的函数 xff0c 不包括完全依赖于不同语法和语义规则的类成员函数 xff08 类成员指针将在另文中讨论 xff09 声明函
  • 汇编语言中可以定义变量吗?怎么定义?有局部变量和全局变量之分吗?作用域是什么?

    汇编语言定义变量的格式为 变量名 变量类型 数值列表 其中 变量类型有 DB DW DD等 xff0c 分别表示变量占有的内存空间 依次为1 xff0c 2 xff0c 4个字节 如 A DB 1 2 3 4 就定义了名称为A的4个占1个字
  • 对比commonjs和ES6

    总结 xff1a xff08 1 xff09 es6模块化就是通过export关键字进行分别导出 xff0c 通过 export 变量标识符1 xff0c 变量标识符2 进行统一导出 xff0c 通过 export defalt key v
  • 如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能

    小白摸索着编写一个上位机界面 xff0c 将遇到的问题及解决方法记录下 xff0c 以供后来的小白使用哈 这篇文章解决的问题是在绘图时候的闪烁问题 其中网上有些介绍的设置控制方式controlstyle的方法 xff0c 这个方法我的理解是
  • c++中vector的用法详解

    vector 向量 C 43 43 中的一种数据结构 确切的说是一个类 它相当于一个动态的数组 当程序员无法知道自己需要的数组的规模多大时 用其来解决问题可以达到最大节约空间的目的 用法 1 文件包含 首先在程序开头处加上 include
  • C++中extern关键字的作用

    1 基本解释 xff1a extern可以置于变量或者函数 前 xff0c 以标示变量或者函数的定义在别的文件中 xff0c 提示编译器遇到此变量和函数时在其他模块中寻找其定义 此外extern也可用来进行链接指定 也就是说extern有两
  • 双缓冲技术绘图原理及简单的VC实现

    为了增加自己对双缓冲绘图技术的理解 xff0c 简要做个笔记 xff08 以Windows为例 xff09 xff1a 1 Windows 绘图原理 我们在 Windows 环境下看到各种元素 xff0c 如菜单 按钮 窗口 图像 xff0
  • C#中Tuple的使用

    定义 xff1a 元组是具有 特定数量和序列 的元素 的数据结构 xff08 注意断句哈 xff01 xff09 元组通常有四种使用方式 一 表示一组数据 例如 xff0c 一个元组可以表示一条数据库记录 xff0c 并且每一个分量对应表示
  • 调用C++dll

    1 dll 的优点 代码复用是提高软件开发效率的重要途径 一般而言 xff0c 只要某部分代码具有通用性 xff0c 就可将它构造成相对独立的功能模块并在之后的项目中重复使用 比较常见的例子是各种应用程序框架 xff0c ATL MFC 等
  • DLL程序入口DllMain详解

    DLL程序入口点函数 xff1a DllMain xff0c 注意 xff1a 大小写是区别的 仅导出资源的DLL可以没有DllMain函数 函数原型 cpp view plain copy print BOOL APIENTRY DllM
  • C++编写DLL的方法

    在写C 43 43 程序时 xff0c 时常需要将一个class写成DLL xff0c 供客户端程序调用 这样的DLL可以导出整个class 也可以导出这个class的某个方法 一 导出整个class 方法很简单 xff0c 只需要在类的头
  • dll文件的c++制作

    1 首先用vs2005建立一个 c 43 43 的dll 动态 链接 库 文件 xff0c 这时 xff0c DllTest cpp 定义 DLL 应用程序的入口点 include 34 stdafx h 34 include 34 Dll
  • vs2008 C++创建和调用标准DLL

    为了共享代码 xff0c 需要生成标准的dll xff0c 本文将介绍在vs2008 C 43 43 生成及调用dll 一 生成DLL 生成一个名为FunDll的dll文件 xff0c 对外函数为addl step1 vs2008 环境下
  • VSCode使用SSH免密登录服务器

    VSCode使用SSH免密登录服务器 前言一 SSH连接服务器1 1 安装ssh插件1 2 配置连接 二 免密登录服务器2 1 生成公钥2 2 服务器新建授权文件2 3 本地复制公钥到服务器 总结 前言 vscode使用remote ssh
  • 使用directX 7结合C#进行2D游戏编程

    使用directX 7结合C xff03 进行2D游戏编程 前言 对于C 的开发人员来讲 xff0c GDI 43 是一个拥有丰富的绘图API指令 传统 高效的程序集 但不幸的是 xff0c 你要想用她来开发一个复杂而又平滑的动画的时候 x
  • DirectX学习笔记_关于Sprite.Draw2D的说明

    在DirectX的Sprite中提供一个Draw2D的方法 xff0c 该方法绘制一个 Sprite 对象用于二维空间中显示 xff0c 在DirectX 9 0C中 xff0c 该方法有6个重载 xff0c 分别是 1 public vo
  • 关于Direct2D

    关于Direct2D Direct2D是一个硬件加速的 xff0c 提供立即模式的二维图形API 它提供了二维的几何体 xff0c 位图 xff0c 文本的高性能 xff0c 高质量的渲染 十分方便的是 xff0c Direct2D与GDI