|
|
发表于 2005-6-9 17:11:00
|
显示全部楼层
Re:请问如何实现以下算法(directx7--ddraw)
你所说的应该是创建n个离屏表面(通常用于硬件的blitter 加速)
并且与主表面(primary surface)有相同的format ,这里我写一个创建离屏表面的函数CreateOffScreenSurface(int width, int height) 用于在显存(video memory)中创建 width*height的surface ,
然后你可以如此生成 n 个表面 :
#define SCREENWIDTH 800
#define SCREENHEIGHT 600
const n = 100;
LPDIRECTDRAWSURFACE7 g_pOffSurface[n] ;
…………………………………
for ( int I =0; i<n ; i++)
{ //当然,你可以把 height 设为变量
g_pOffSurface = CreateOffScreenSurface(SCREENWIDTH, SCREENHEIGHT);
}
方法: 过程跟创建主表面差不多,
1 .既然离屏表面也是表面,如果是DX7 的话,则定义为 LPDIRECTDRAWSURFACE7 g_pOffSurface ; // 如果很多表面的话,就定义为数组。
2. 因为要设定表面的大小 ,必须使“表面描述结构” DDSURFACEDESC2 中的dwWidth 和 dwHeight 有效,所以必须把DDSURFACEDESC2 中的成员 dwFlags 设为 : dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT (其中 DDSD_CAPS是为了使 dwCaps 有效)
3. 把 DDSURFACEDESC2 中的成员 dwWidth ,dwHeight 设为你想要的宽和高。
4. 因为我们要的是离屏表面(off screen plane),并且在显存中创建,所以DDSURFACEDESC2.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN |VIDEOMEMEORY ;
5. 创建表面 : CreateSurface(&ddsd, g_pOffSurface ,NULL); // ddsd为 DDSURFACEDESC2 结构
6. 设置颜色键 (color key) : 如果在blit时,你想让图形的某种颜色透明(一般为背景色)的话,如下设:
DDCOLORKEY colorKey;
colorKey.dwColorSpaceLowValue = 0; //黑色 ,
colorKey.dwColorSpaceHighValue = 0;
g_pOffSurface->SetColorKey(DDCKEY_SRCBLT, &colorKey);
函数大概为这样
LPDIRECTDRAWSURFACE7 CreateOffScreenSurface (int width, int height)
{
DDSURFACEDESC2 ddsd; //用于描述表面
LPDIRECTDRAWSURFACE7 lpOffSurface; // 离屏表面
// 初始化 ddsd 表明要创建什么样的表面
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | VIDEOMEMEORY; //离屏,并在显存中
// 创建表面
if (FAILED(g_pdd->CreateSurface(&ddsd,& lpOffSurface ,NULL))) //g_pdd为 LPDIRECTDRAW7
return NULL;
return(lpdds);
}
应用 :
比如你想让第num个表面显示在屏幕上,可以这样做:
1. 创建主表面 : g_pPrimarySurface (通过 CreateSurface(…)函数) 和他的后备缓冲(back buffer) g_pBackBuffer ( 通过 g_pPrimarySurface->GetAttachedSurface(…) )
2. 创建离屏表面(n个)g_pOffSurface[n] , 并用图像填充(例如bitmap ) 。
3. 把第num表面blit 到backbuffer 中: g_pBackBuffer->Blt(&destRect, g_pOffSurface[num],
&sourceRect,(DDBLT_WAIT),
NULL))) ;
它表示把表面g_pOffSurface[num] 中sourceRect 区域的象素(color)考到(不确切!not copy, it blit,仅为了便于说明)g_pBackBuffer 的 destRect 中。
4. 显示(flip,或者说为交换前后缓冲区): g_pPrimarySurface->Flip(NULL, DDFLIP_WAIT)
5. ok , take a break!!
|
|