) < stonesize*stonesize)
buf1[BACKWIDTH*posy+posx] = -stoneweight;
……
}
虽然在前面的推导中多处采用了看似过分的非常近似的处理,但是完全不必担心,事实证明,用这种方法,在速度和图象上都可以获得非常好的效果。下边就是从其中截取的一帧画面,很逼真的再现了水波的产生过程。
这种用数据缓冲区对图象进行处理的方法的最大的好处就是:程序运算和显示的速度与水波的复杂程度是无关的,用类似的方法完全可以对其他一些物理、自然现象如烟雾、云彩、阳光等进行逼真的模拟。
三、 利用DirectDraw完成对图形的加速
从前面可以看出,我们一直在处理速度上比较严格。竭尽所能来提高数据的处理速度,不仅在算法上如此,在显示上更是如此。普通的GDI函数的处理速度在这里是无法容忍的,对此采用了DirectX系列技术中的DirectDraw技术来对图形进行加速处理。
DirectDraw是DirectX SDK系列中的一员,也是其中最主要的一个部件。它允许程序员直接的操作显存、硬件位图映射以及硬件覆盖和换页技术。它在提供直接访问显示设备的同时,与GDI相兼容,它只是一个软件接口,提供了一种与设备无关的途径,以获得访问特定的显示设备的某些高级特性的能力。大体上DirectDraw可以提供了以下几个功能,而这些功能以前只有那些专为特定显示设备所写的软件中才能使用:
支持双缓冲和换页图形
访问、控制显示卡的位图映射
支持3D z-buffers (z缓存)
支持z方向(z-ordering)硬件辅助覆盖。
访问图形缩放硬件
仿真访问标准的和增强的显示设备内存空间
下面就对DirectDraw的在图形加速方面中的具体应用结合本程序的具体实例来进行介绍,为方便起见,本工程采用Microsoft SDK编码,先要对DirectDraw环境进行初始化,完成设置并在其中对主页面和各离屏页面进行创建并初始化之:
BOOL InitDDraw(void) { DDSURFACEDESC ddsd; HRESULT ddrval; …… //创建DirectDraw对象 ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); …… //取得全屏独占模式
|