最近做了一个项目,需要使用Windows的2D渲染技术,对GDI、Direct2D、Direct3D、opengl等图像渲染库做了一个比较,发现使用Direct2D是最优的。因为它既没有Direct3D和Opengl使用的复杂度,又具有硬件加速功能(GDI没有硬件加速功能)。所以最终决定使用Direct2D来作为本项目的图形渲染库,但是在使用Direct2D的时候发现了一个问题,就是网上关于Direct2D的学习资料太少了(在百度上搜索了一下,发现一本书籍也没有),唯一的学习资料就是MSDN。为了能让更多的人快速入门Direct2D,所以决定将MSDN上的Direct2D内容翻译一遍,方便后面需要学习Direct2D 的朋友。好了,话不多说,进入正题吧!!!
Direct2D 是什么?
Direct2D是一种支持硬件加速、实时的2D图像渲染API,它为2D几何图形、位图和文本的绘制提供高性能和高质量的呈现。Direct2D API被设计成可以和现有的GDI、GDI+、Direct3D 等API进行交互(使用多个API绘制同一表面)。
Direct2D主要是为以下开发者而设计的:
- 大型、企业级本地应用程序的开发人员。
- 开发控件和图形库以供别人进行二次开发的开发人员。
- 需要2D图形服务器端渲染的开发人员。
- 使用Direct3D图形的开发人员,需要为菜单、用户界面(UI)元素提供简单、高性能的2d和文本渲染。
为什么需要Direct2D API?
Microsoft创建新的2D图形API的主要目的包括以下内容:
- 随着用户对程序界面的美观度要求越来越高,已用的API已经不能满足用户的需求了,需要急需一套新的API来替换。
- 需要一套新的API能使用最新显卡的硬件加速功能。
- 使开发人员能够编写代码来呈现可以在服务上下文中运行的2d图形。
近年来,终端用户开始期望在数字体验中获得更大的视觉保真度,这一趋势也反映在消费电子产品上。GPS设备、媒体播放设备、移动电话和数码相机年复一年地提供持续丰富的体验。这一趋势也体现在电影、电视、视频游戏和网络上的图像内容的多样性上。为了跟上这些变化的步伐,我们不断要求开发人员将现有的Windows应用程序提升到视觉丰富的新水平。
现代Windows pc的图形处理器也在稳步发展,这主要是受视频游戏和Windows Media Center和Aero等Windows体验的推动。一些Windows应用程序可以通过使用 Direct3D和Windows Presentation Foundation (WPF)来利用最新的GPU。而Direct3D是为3D应用程序服务的,WPF是为.Net服务的,但是依然存在好多GDI和GDI+的程序没用办法利用最新的GPU加速功能。
最后,对于在企业和web开发场景中工作的开发人员来说,对可以在服务中使用的图形API的需求已经成为一个新兴的需求。现有的渲染api专注于单个用户会话中的客户端呈现。因此,当在服务上下文中使用时,它们在健壮性和可伸缩性方面可能会有所欠缺。需要一个新的API来解决这个问题。
高性能和最大可用性
Direct2D是一个在Direct3D 10.1 API之上构建的用户模式库。这意味着Direct2D应用程序可以利用现代主流gpu上的硬件加速渲染。硬件加速也可以在早期的Direct3D 9硬件上通过使用Direct3D 10-level-9渲染实现。这种方式在现有Windows pc上的图形硬件上提供了出色的性能。
注意:从Windows 8开始,Direct2D是在Direct3D 11.1 API之上构建的。
下图显示了Direct2D的分层架构:
对于硬件加速不可用的场景,Direct2D包含一个高性能的软件光栅化。Direct2D的软件光栅化性能也要远远高于GDI的。软件光栅化也被设计用于服务环境中。
使用Direct2D渲染的内容也可以通过使用Windows 7操作系统中的远程桌面远程显示。开发者可以选择是由显示计算机上的GPU处理渲染,还是在本地渲染并以位图的形式传输。
渲染图像质量
与使用GDI相比,使用Direct2D的应用程序可以提供更高的图像渲染质量。Direct2D使用抗锯齿来在渲染内容中呈现更平滑的曲线和线条。在渲染2D图元时,还完全支持透明度和alpha混合。下面的图片比较了使用GDI渲染的内容(左边)和使用Direct2D渲染的内容(右边)。
互操作性
Direct2D与Direct3D的互操作性比GDI与Direct3D的互操作性更容易。用于可以先用Direct2D 渲染应用程序的指定区域,然后再用GDI或者Direct3D渲染。
Direct2D还可以使用DirectWrite绘制高质量的文本。
总结
Direct2D允许开发人员在他们的应用程序中构建2d图形,它能比GDI提供更好的视觉质量,以及与现代gpu兼容的性能特性。Direct2D互操作性模型允许开发人员可以同时使用Direct2D、GDI、GDI+或direct3d渲染。