Windows Game Note4

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:按视口剪切位图的矩形边界,只画位图位于视口中的部分,较复杂,但是相当块,机会没有性能损失,不会进入内部循环。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值