irrlicht的显示原理

我这个标题有点故弄玄虚的味道,其实我的本意是想通过阅读irrlicht的源码更好的理解irrlicht的原理。但是网上类似的文章太多了,鱼龙混杂层次不齐。但是往往都是从helloworld开始到source code结束,再加上贴很多的代码,始终还是停留在入门级别的讲解。怎么能让做到深入浅出,让读者更好的理解背后的真相呢?这就是我写着一些列博客的目的。作为一个irrlicht的初学者,希望通过自己的理解和记录获得进步。

当我们运行hello world的时候一个小方块的窗口就显示在我们面前,程序会在自己的窗口clientarea内不停的更替图形,形成我们看到的动画效果。这个过程就是本文要讲的主要内容,期间不会涉及到代码,在后续的博客中会陆续讲解代码。

Irrlicht程序怎么通过这个窗口把图形显示在桌面上呢?相信很多童鞋都知道大致的原理,但是一说到细节就迷茫了。理解这个过程不是写irrlicht程序的必要条件,甚至可以说毫无关系。我们只要会调用irrlicht封装好了的API就可以写出一个漂亮的3D动画。但是如果我们的目的不止是用API出一个程序,而是要高效的运用、灵活的应用,那么我们不得不面对这些看上去毫无关系的话题。所以本文的话题不适合3D的初学者。

我们先从桌面管理说起。在XP时代,桌面的本质就是内存中的一个缓存,这块内存同时在CPU和GPU的地址空间内,除了做桌面以外不能挪为它用。对于这块内存大家都不陌生,在32位系统的机器上,我们买了一条2G的内存条,但是我们只得到了1G多的可使用内存。那些消失的内存有一部分就是被GPU使用了,我们的桌面正在其中。操作系统把各个窗口的像素值写到这个缓存内。当窗口A被窗口B遮挡的时候,在显存缓存中的像素值也被B所覆盖。这时候我们用程序去抓取A的截图的时候,会得到窗口B的像素。我们可以通过很多方式去绘制这块显存中的数据,比如API GetDC就可以得到桌面的设备上下文,也可以用Windbg直接修改显存的物理地址。Win7/Vista以后windows引入了DWM来管理桌面。此时的DWM不是强制的,用户可以将DWM关闭,让Win7回到XP的桌面管理模式。但是到了Win8,DWM就不能关闭了。我们可以认为DWM就是我们看到的桌面,我们桌面上的一切都是DWM绘制或者整合成的。

实际上DWM的本身就是一个DX程序,就如同我们平时写的DX程序一样。所有的DX程序都具有一张或多张后台缓存(back buffer),用于将图形预先渲染到后台中。至于后台缓存的作用,相信写过画图程序的童鞋应该都很清楚,它用于提高程序的效率(消除闪烁)。DX的后台缓存的作用大致差不多。身为DX程序的DWM也具有它后台缓存。桌面首先在后台缓存中组合完毕,然后显示到我们面前。

Win7上面那些很炫的3D效果都是DWM引入的,除了效果好看外,还真的没有发现什么好的地方。DWM的功能有时候有造成一些程序的不兼容,以至于不得不在运行的时候关闭DWM。一方面的原因是因为做了一张DX的纹理,它的存储格式有可能不是线性的,所有我们得到的结果不一定是我们想要的结果。

Irrlicht可以同时运行在OpenGL和DX9图形库上,本文单表DX9。为了让程序的渲染结果在桌面上显示出来,程序必须和DWM有所交互,告诉DWM自己的后台缓存(back buffer)。如果你的程序是运行在窗口模式下,irrlicth的运行过程如下:

1)  Irrlicht应用程序创建了一个win32窗口。

2)  DWM通过显卡驱动程序创建了一张共享的GDI纹理,大小通常等于client area。

3)  Irrlicht通过DX9创建了一张后台缓存纹理(back buffer),将图形渲染到这张纹理中。

4)  DX9调用present,告诉OS这张纹理可以显示了。

5)  OS将irrlicht创建的后台缓存纹理拷贝到共享的GDI纹理中。

6)  DWM将这张GDI纹理拷贝到自己的back buffer中。

7)  DWM的backbuffer通过present API把back buffer显示到桌面。

Irrlicht完成了窗口的显示。如果运行的全屏模式,DWM就不起作用,出irrlicht外的其他程序也不会进行present,irrlicht的back buffer就是桌面的back buffer,最后显示在桌面的就是irrlicht。在win7以后大部分的窗口都是一个DX程序,显示的原理和上面所讲的差不多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值