1、使用blitter进行内存填充:blitter是一个相当复杂的硬件。内存填充以为着用某些值填充VRAM中的一块区域。
利用硬件blitter你可以立即直接填充或者移动大块VRAM和DirectDraw表面。
DirectDraw有两个用于显存块移动的函数是IDIRECTDRAWSURFACE7::Blt()和
IDIRECTDRAWSURFACE7::BltFast()
Blt()函数中的dwFlags参数,决定DDBLTFX结构的有效成员。在DDBLTFX中,特殊的行为诸如缩放、旋转等等都可以被控制,还有色彩键的信息。
typedef struct _DDBLTFX
{
DWORD dwSize; // size of structure
DWORD dwDDFX; // FX operations
DWORD dwROP; // Win32 raster operations
DWORD dwDDROP; // Raster operations new for DirectDraw
DWORD dwRotationAngle; // Rotation angle for blt
DWORD dwZBufferOpCode; // ZBuffer compares
DWORD dwZBufferLow; // Low limit of Z buffer
DWORD dwZBufferHigh; // High limit of Z buffer
DWORD dwZBufferBaseDest; // Destination base value
DWORD dwZDestConstBitDepth; // Bit depth used to specify Z constant for destination
union
{
DWORD dwZDestConst; // Constant to use as Z buffer for dest
LPDIRECTDRAWSURFACE lpDDSZBufferDest; // Surface to use as Z buffer for dest
} DUMMYUNIONNAMEN(1);
DWORD dwZSrcConstBitDepth; // Bit depth used to specify Z constant for source
union
{
DWORD dwZSrcConst; // Constant to use as Z buffer for src
LPDIRECTDRAWSURFACE lpDDSZBufferSrc; // Surface to use as Z buffer for src
} DUMMYUNIONNAMEN(2);
DWORD dwAlphaEdgeBlendBitDepth ; // Bit depth used to specify constant for alpha edge blend
DWORD dwAlphaEdgeBlend; // Alpha for edge blending
DWORD dwReserved;
DWORD dwAlphaDestConstBitDepth ; // Bit depth used to specify alpha constant for destination
union
{
DWORD dwAlphaDestConst; // Constant to use as Alpha Channel
LPDIRECTDRAWSURFACE lpDDSAlphaDest; // Surface to use as Alpha Channel
} DUMMYUNIONNAMEN(3);
DWORD dwAlphaSrcConstBitDepth; // Bit depth used to specify alpha constant for source
union
{
DWORD dwAlphaSrcConst; // Constant to use as Alpha Channel
LPDIRECTDRAWSURFACE lpDDSAlphaSrc; // Surface to use as Alpha Channel
} DUMMYUNIONNAMEN(4);
union
{
DWORD dwFillColor; // color in RGB or Palettized
DWORD dwFillDepth; // depth value for z-buffer
DWORD dwFillPixel; // pixel value for RGBA or RGBZ
LPDIRECTDRAWSURFACE lpDDSPattern; // Surface to use as pattern
} DUMMYUNIONNAMEN(5);
DDCOLORKEY ddckDestColorkey; // DestColorkey override
DDCOLORKEY ddckSrcColorkey; // SrcColorkey override
} DDBLTFX;
Blt()函数功能齐全但较复杂,而BltFast()较简单但具有较少可选参数。另外,Blt()使用DirectDraw裁剪器,而BltFast()没有。
2、使用Blt()函数填充表面的方法:
① 将要填充的色彩索引或者以RGB编码的颜色放进DDBLTFX结构的dwFillColor字段。
② 将RECT结构设置为你的目标表面上要填充的区域。
③ 用控制标志DDBLT_COLORFILL | DDBLT_WAIT从IDIRECTDRAWSURFACE7接口调用Blt()。
在你将任何一个RECT结构发送给大多数DirectDraw函数时,一般它包含左上角,但不包含右下角。
3、要想在任意两个表面之间blit,要做的就是正确设置RECT并使用正确的参数调用Blt();
当你画一个位图时,位图总是在某个矩形形状的像素矩阵中,但是,当进行blit时,你并不希望所有的像素都被拷贝,许多时候,你会选择一个色彩作为透明色彩,如黑色,蓝色,等等,它们不被拷贝。DirectDraw支持称为色彩键(Color Key)的技术。
4、裁剪通常被定义为:不画那些落在视口(Viewport)或窗口(Window)之外的像素或图形元素
裁剪位图同裁剪像素一样简单。有两种方法:
方法1:在生成像素的时候裁剪位图中的每一个像素。简单,但是慢。
方法2:按视口剪切位图的矩形边界,只画位图位于视口中的部分,较复杂,但是相当块,机会没有性能损失,不会进入内部循环。
Blt()函数中的dwFlags参数,决定DDBLTFX结构的有效成员。在DDBLTFX中,特殊的行为诸如缩放、旋转等等都可以被控制,还有色彩键的信息。
typedef struct _DDBLTFX
{
} DDBLTFX;
2、使用Blt()函数填充表面的方法:
① 将要填充的色彩索引或者以RGB编码的颜色放进DDBLTFX结构的dwFillColor字段。
② 将RECT结构设置为你的目标表面上要填充的区域。
③ 用控制标志DDBLT_COLORFILL | DDBLT_WAIT从IDIRECTDRAWSURFACE7接口调用Blt()。
3、要想在任意两个表面之间blit,要做的就是正确设置RECT并使用正确的参数调用Blt();
4、裁剪通常被定义为:不画那些落在视口(Viewport)或窗口(Window)之外的像素或图形元素
裁剪位图同裁剪像素一样简单。有两种方法:
方法1:在生成像素的时候裁剪位图中的每一个像素。简单,但是慢。
方法2:按视口剪切位图的矩形边界,只画位图位于视口中的部分,较复杂,但是相当块,机会没有性能损失,不会进入内部循环。