图形变换器

1.使用图形变换器进行内存填充
内存填充意味着用一定的值填充VRAM中的一块区域。你已经在锁定画面,利用memset()或memcpay()操作画面内存时做过了几次,但是这些方法

有一些问题:
首先,你采用主CPU进行内存填充,所以主总线是传输的一部分。其次,组成画面的VRAM不可能总是线性。这是,你不得不进行一线一线填充或

者移动。但是,利用硬件图形转换,你可以马上直接填充或者移动大块VRAM或者DirectDraw画面。

(1)DirectDraw的两个图形转换函数是IDIRECTDRAWSURFACE4::Blt()和BltFast();
源函数:HRESULT Blt(LPRECT lpDestRect,
                   LPDIRECTDRAWSURFACE4 lpDDSrcSurface,
                   DWORD dwFlags,
                   LPDDBLTFX lpDDBltFx);
lpDestRect 定义了左上角和右下角的四边形结构,是要向目标画面图形变换的区域。
           如果参数为NULL,使用整个目标画面。
lpDestSurface 用作源的DirectDraw画面的IDIRECTDRAWSURFACE4接口地址。
lpScrRect 定义了左上角和右下角的四边形结构,是用来图形变换的的源画面区域。如
          果参数为NULL,使用整个源画面。
dwFlags   决定接下来参数DDBLTFX结构的有效成员的个数。在DDBLTFX中,特殊的行为          缩放、旋转等等可以控制,还有色彩关键字

的信息。
lpDDBltFx 是一个包含有关图形变换所需要的信息的结构。

(2)BltFast()
源函数:HRESULT BltFast(DWORD dwx,
                       DWORD dwy,
                       LPDIRECTDRAWSURFACE4 lpDDSrcSurface,
                       LPRECT lpSrcRect,
                       DWORD dwTrans)

dwX,dwY是在目标画面上需要图形变换的(x,y)坐标
lpDDSrcSurface是DirectDraw的源画面的IDIRECTDRAWSURFACE4接口地址
lpScrRect是定义了左上角和右下角的四边形结构,是就用来图形变换的源画面区域
dwTrans是图形变换操作的类型

(3)为什么有两个不同的图形变换函数?
Blt()是复杂选择的模型,而BltFast()是具有较少可选参数的简单模型。另外,Blt()使用DirectDraw剪切,而BltFast()没有。这就意味着

BltFast()比Blt()更快,在HEL时大约快了10%,在硬件上甚至更快。关键点是在剪切时用Blt(),不需要时用BltFast()


2.用Blt()函数()填充画面的方法:
(1).将要填充的色彩索引或者RGB码放进DDBLTFX结构的dwColorFil()字段。
(2).在你的目标画面上设计要填充的区域RECT结构。
(3).用控制标志DDBLT_COLORFILLIDDBLT_WAIT从IDIRECTDRAWSURFACE4接口指针调用 Blt()。这点很重要,Blt()和BltFast()都是从目标画面界

面上调用,而不是从源画面上调用。

实例程序:
DDBLTFX ddbltfx;
RECT dest_rect;

DDRAW_INIT_STRUCTRUE(ddbltfx);

Ddbltfx.dwFillColor = color_index;

dest_rect.left = x1;
dest_rect.top = y1;
dest_rect.right = x2;
dest_rect.bottom = y2;

lpddsprimary->Blt(&dest_rect,
                  NULL,
                  NULL,
                  DDBLT_COLORFILL | DDBLT_WAIT,
                  &ddbltfx);

注意:在你将任何一个矩形结构发送给DirectDraw函数时,这里有一个很小的细节,一般,它们是包含左上角,除去右下角。换句话说,就是如

果发送一个RECT是(0,0)到(10,10),实际的扫描区域是(0,0)到(9,9),记住这一点,如果想将640*480屏幕全部填充,则需将左上角设为(0,0),右

下角设为(641,481)


3.从一个画面向另一个画面复制位图
   图形变换就是从一些源内存向目标内存复制矩形图象。这可以包括复制整个屏幕,或者在游戏中代表小物体的小图象。两种情况下,都需要

引导图形变换,从一个画面向另外一个复制数据。实际上,你已经知道了如何做了,只是还没有意识到。图形变换填充演示程序需要两处改动


   当使用Blt()函数时,你一般发送一个源矩形和画面以及一个目标矩形和画面执行图形变换。图形变换将从源矩形向目标矩形拷贝像素。源

和目标画面可以是同一个,但是通常是不同的。一般,后者是多数精灵引擎的基础。

4.图形变换的透明性
当你画一个位图时,位图总是在一个像素的矩形矩阵中。但是,当进行图形变换时,你并不希望所有的像素都被拷贝。许多时候,你会选择一个

色彩作为透明色彩,如:黑色、蓝色、绿色等等,它们不被拷贝(参见Blit8*8());

                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值