Direct2D是微软在win7中的新技术,内部采取了3D渲染模式,底层是DXGI,比原来的GDI和GDI+效率大大提高,通过显卡的渲染,图像质量也有大幅度的提升。
目前我正在学习游戏引擎的编程,对于传统2D渲染效率低感觉极为不满意,用3D技术渲染两个三角形+纹理贴图 又略感费事,Direct2D无疑是一个好选择。
支持快速渲染高质量图片,优秀的图元绘制,加上方便的2D矩阵变换,蒙版等特效的应用,为2D图像处理提供了极为便利的操作。
经过一天多的测试,终于了解了Direct2D的基本工作模式,当然以下只是我自己的理解,如有疏漏错误,还请网友指正。
首先说几个Direct2D中的概念
设备无关资源
ID2D1DrawingStateBlock
ID2D1Factory //核心工厂,用来创建其他各对象
ID2D1Geometry及继承自它的接口 //常用图元
ID2D1GeometrySink和ID2D1SimplifiedGeometrySink
ID2D1StrokeStyle //常用画线模式
设备无关资源只要创建后,就保存在系统堆内存中,整个程序运行期间都存在,不用时按照COM组件的模式释放即可
设备相关资源
ID2D1Brush及继承自它的接口 //画刷
ID2D1Layer//图层
ID2D1RenderTarget及继承自它的接口
设备相关资源是保存在内存或显存中,如果设备丢失,则必须重建
下面重点介绍RenderTarget
RenderTarget是一个抽象的渲染屏面,和设备的关系最紧密,和DC有点类似
用CreateHwndRenderTarget创建时,要求创建与hwnd所指示窗口,客户区域大小相同的绘图区域,如果大小不符,则整个绘图区域会被自动拉伸或压缩
当窗口大小被改变时,应该调用其resize方法来修改绘图区域大小,以满足用户等比例绘制需要
我看很多网上的程序是将创建设备相关资源放到OnRender一开始,起初我误以为是每次都要创建相关资源,即每次窗口改变都会丢失设备,其实不然,类比Direct3D丢失设备一般发生在以下几种情况:
- 程序在全屏状态下失去键盘焦点(全屏时按下Alt+Tab或Win+D键或Win+L键)
- 其他程序进入全屏状态
- 电源管理事件,比如屏保等
所以我们平时一般不用太担心发生设备丢失,但一个好的程序必须能应对各种问题,下面就说如何解决设备丢失。
从微软的Demo看,我们是在最后渲染结束后,检测HRESURT返回值是否为 D2DERR_RECREATE_TARGET宏
如果是的话,清除当前资源,当下次OnRender时,创建设备相关资源时进行检测,没有资源便创建。
本文介绍了微软的Direct2D技术,它在Windows 7中引入,利用3D渲染提高2D图形效率,底层基于DXGI。Direct2D提供高质量图片渲染、图元绘制和2D矩阵变换等功能,适合高效2D图像处理。文章讨论了设备无关和设备相关资源,重点讲解了RenderTarget的使用和设备丢失的处理策略。
1343

被折叠的 条评论
为什么被折叠?



