1.如你所知,显示在屏幕上的图像只不过是以某种格式存储在内存中的有色像素组成的矩阵,或是调色板化的或是RGB模式的。在任何一种情况下,要想做点什么你都必须知道怎样绘制图到内存中,然而DirectDraw的设计者决定将显存的概念予以抽象,从而无论你的系统中的显卡有多么古怪,访问视频表面的方法都是一样的。因此DirectDraw支持显示表面。
2.显示表面是能存储位图数据的矩形内存区域。有两种显示表面:主显示表面和从显示表面。
I. 主显示表面直接相当于被显卡光栅画的实际显存,而任何时候都是可见的,任何DirectDraw程序里都只能有一个主显示表面,它直接指向屏幕图像并常驻VRAM(显存,帧存储器)。
II.从显示表面更灵活,大小任意,内存允许可随意创建。用途:
A. 创建一或两个从表面它们总是和主显示表面有同样地色彩深度和几何分布。当用下一个动画帧更新这些离屏面,然后迅速的拷贝或是用换页技术将离屏面切换到主显示面可以达到平滑显示动画的目的。这称为双缓冲或三缓冲。
B.保存你的位图图像和游戏中的表示对象的动画。只有使用DirectDraw显示表面才能调用使用于位图数据的硬件加速。
3.创建一个主题显示表面
A. 步骤:
I.填充一个 DDSURFACEDESC2 数据结构,描述你所希望创建的显示表面
II.调用IDirectDraw7::CreareSurface()来创建显示表面。
DDSURFACEDESC2的结构
typedef struct _DDSURFACEDESC2 { DWORD dwSize; DWORD dwFlags; DWORD dwHeight; DWORD dwWidth; union { LONG lPitch; DWORD dwLinearSize; } DUMMYUNIONNAMEN(1); DWORD dwBackBufferCount; union { DWORD dwMopMapCount; DWORDdwRefreshRate; } DUMMYUNIONNAMEN(2) DWORD dwAlphaBitDepth; DWORD dwReserved; LPVOID lpSurface; DDCOLORKEY ddckCKDestOverlay; DDCOLORKEY ddckCKDestBLt; DDCOLORKEY ddckCKSrcOverlay; DDCOLORKEY ddckCKSrcBlt; DDCOLORKEY ddpfPixelFormat; DDSCAPS2 ddsCaps; DWORD dwTextureStage; } DDSURFACEDESC2,FAR* LPDDSURFACEDESC2;
重要结构解释:
dwSize:所有Direct数据结构里面最重要的域,保存结构大小的字符。
dwFlags:指示数据填充域或操作接受域。
dwWidth:表面以像素计的宽度
dwHeight:表面以像素计的高度。
lPitch:显示模式的水平内存距离。
lpSurface:这个域用于获取指向你所创建的显示面驻留的实际内存的指针。
dwBackBufferCount:这个域用于设置或是读取后备缓冲。
ddckCKDestBLt:这个域用于控制目标色键,即在位块传输操作中控制可以写入的色彩部件。
ddckCKSrcBlt:这个域用于指示源色键,即基本上是执行位图操作时你不希望进行位块传输的颜色。
ddpfPixelFormat:这个域用于获取显示表面的像素格式。
ddsCaps:这个域用于返回你所请求的显示表面的一些未在别处定义的属性。
B.创建显示表面
LPDDSURFACEDESC2 ddsd; memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps = DDSCAPS_PRIMARYSURFACE; if(FAILED(lpdd -> CreareSurface(&ddsd,&lpddsprimary,NULL))) { //ERROR }
若函数调用成功,lpddsprimary会指向新的显示表面接口。