1、执行位图的缩放很简单,需要你做的就是改变目标RECT的尺寸,只要它同源RECT的尺寸不同,图像就会被缩放。
对于旋转,你不得不设一个DDBLTFX结构,执行旋转操作,你必须有支持旋转的硬件加速,然后设置DDBLTFX结构。例:
DDBLTFX ddbltfx;
DDRAW_INIT_STRUCT(ddbltfx);
ddbltfx.dwRotationAngle = angle;
然后,像通常的那样调用Blt(),但是需要加上标志DDBLT_ROTATIONANGLE到标志参数,并像下面这样加上ddbltfx参数:
if(FAILED(lpddsback->Blt(&dest_rect, lpdds->image, &source_rect, (DDBLT_WAIT|DDBLT_KEYSRC | DDBLT_ROTATIONANGLE), &ddbltfx)));
2、离散采样理论:
有两种类型的普通映射,向前映射(是指像素从源向目标映射)和反向映射(它用目标中的每一个像素寻找其源像素)。 通过一定频率(称作采样频率,Samle Rate)对源进行采样,并且基于该采样频率进行目标填充。
3、256色模式下的色彩动画
色彩动画是指在运行中对调色板项进行操作,如更改或轮转。例如,发光物质,闪光灯等其他许多效果,只需在运行时操纵的色彩表中的项,就可以得到。
色彩选择或者色彩滚动,通常,它是以相毗邻的色彩相或者寄存器的集合作为参数,然后以循环的方式移动它们的一种处理。采用这种技术,不需要向屏幕写一个像素,就可以使物体看起来像是在移动。用这种方法模拟水或液体流动的效果非常好。
4、使用RGB模式的技巧
采用RGB模式的问题是没有任何色彩间接寻址,换句话说,在屏幕上的每一个像素都有自己的色彩值,所以没有办法让单个变动影响整个图像。但是还是有两个方法可以进行色彩相关的处理:
① 利用手动色彩变化或查询表
② 采用新的DirectX彩色和Gamma补偿,实时地在主表面执行色彩操作。
Gamma补偿处理计算机显示器对输入驱动的非线性响应,如多情况下Gamma补偿允许你修改视频信号的强度和亮度,更有甚者,Gamma补偿允许分别改变红色,黄色,蓝色通道以获得有意思的效果。
例如,如果想在16位图形模式下模拟一个在(x, y)处,具有一定尺寸的正方形聚光灯。 采用查询表, 不再是使用16位模式下所有的65536种色彩,你只要画那些可能会被聚光灯照到的物体,比方说,聚光灯具有均匀分布在64KB空间的1024种色彩的光,然后,你可以创建一个二维数组查询表,表的大小事1024乘以你想要的强度等级,如64.之后你取出每个实际色彩的RGB值,计算它的64级的浓淡,并全部存储在表中。当你创建聚光灯时,使用16位字作为表的索引,同时把光的浓淡做第二级索引,表中的16位结果就是预先调制好的RGB值。这样,光照操作就被实现为一个简单的查询。
这种技术可以被用来进行透明。alpha混合、光照、暗化等处理。
IDirectDrawColorControl使你可以控制亮度、对比度、色调、饱和度、锐度和gamma值。要使用这个接口,必须通过IID_IDirectDrawColorControl标示符从主表面指针中访问它。 一旦获得了该接口,接下来就可以准备一个DDCOLORCONTROL结构。
typedef struct _DDCOLORCONTROL
{
DWORD
dwSize;
DWORD
dwFlags;
LONG
lBrightness;
LONG
lContrast;
LONG
lHue;
LONG
lSaturation;
LONG
lSharpness;
LONG
lGamma;
LONG
lColorEnable;
DWORD
dwReserved1;
} DDCOLORCONTROL;
然后调用IDIRECTDRAWCOLORCONTROL::SetColorControl(),主表面会立即被修改,改动一直维持到你再一个调用此函数。
5、从DirectDraw表面获得GDI兼容DC, 函数是IDIRECTDRAWSURFACE7::GetDC(); 一旦用完了DirectDraw兼容DC,一定要像对待普通GDI DC那样释放它。函数是IDIRECTDRAWSURFACE7::ReleaseDC();
6、主DirectDraw对象: 主DirectDraw对象代表视频卡并描述HEL和HAL。 函数GetCaps()获得HEL和HAL的能力。然后,你可以在返回的DDCAPS结构中查看关心的数据。
GetDisplayMode(),当你的程序在窗口模式下运行的时候,它可以给出Windows系统的显示模式。
关于表面:主表面和后背缓冲表面的性能非常重要,因为他们可以使你洞察每一个硬件特性,用来获取任意表面能力的函数是IDIRECTDRAWSURFACE7::GetCaps();
下一个与表面相关的函数是IDIRECTDRAWSURFACE7::GetSurfaceDesc(),它返回一个DDSURFACEDESC2结构,它包含更多表面本身的细节。
还有一个方法IDIRECTDRAWSURFACE7::GetPixelFormat();
使用调色板:
DirectDraw仅仅给你一个按位编码的字用以描述任意给定的调色板的能力,函数IDIRECTDRAWPALETTE::GetCaps()。
DDBLTFX ddbltfx;
DDRAW_INIT_STRUCT(ddbltfx);
ddbltfx.dwRotationAngle = angle;
然后,像通常的那样调用Blt(),但是需要加上标志DDBLT_ROTATIONANGLE到标志参数,并像下面这样加上ddbltfx参数:
if(FAILED(lpddsback->Blt(&dest_rect, lpdds->image, &source_rect, (DDBLT_WAIT|DDBLT_KEYSRC | DDBLT_ROTATIONANGLE), &ddbltfx)));
2、离散采样理论:
有两种类型的普通映射,向前映射(是指像素从源向目标映射)和反向映射(它用目标中的每一个像素寻找其源像素)。 通过一定频率(称作采样频率,Samle Rate)对源进行采样,并且基于该采样频率进行目标填充。
3、256色模式下的色彩动画
4、使用RGB模式的技巧
① 利用手动色彩变化或查询表
② 采用新的DirectX彩色和Gamma补偿,实时地在主表面执行色彩操作。
例如,如果想在16位图形模式下模拟一个在(x, y)处,具有一定尺寸的正方形聚光灯。 采用查询表, 不再是使用16位模式下所有的65536种色彩,你只要画那些可能会被聚光灯照到的物体,比方说,聚光灯具有均匀分布在64KB空间的1024种色彩的光,然后,你可以创建一个二维数组查询表,表的大小事1024乘以你想要的强度等级,如64.之后你取出每个实际色彩的RGB值,计算它的64级的浓淡,并全部存储在表中。当你创建聚光灯时,使用16位字作为表的索引,同时把光的浓淡做第二级索引,表中的16位结果就是预先调制好的RGB值。这样,光照操作就被实现为一个简单的查询。
IDirectDrawColorControl使你可以控制亮度、对比度、色调、饱和度、锐度和gamma值。要使用这个接口,必须通过IID_IDirectDrawColorControl标示符从主表面指针中访问它。 一旦获得了该接口,接下来就可以准备一个DDCOLORCONTROL结构。
typedef struct _DDCOLORCONTROL
{
} DDCOLORCONTROL;
然后调用IDIRECTDRAWCOLORCONTROL::SetColorControl(),主表面会立即被修改,改动一直维持到你再一个调用此函数。
5、从DirectDraw表面获得GDI兼容DC, 函数是IDIRECTDRAWSURFACE7::GetDC(); 一旦用完了DirectDraw兼容DC,一定要像对待普通GDI DC那样释放它。函数是IDIRECTDRAWSURFACE7::ReleaseDC();
6、主DirectDraw对象: 主DirectDraw对象代表视频卡并描述HEL和HAL。 函数GetCaps()获得HEL和HAL的能力。然后,你可以在返回的DDCAPS结构中查看关心的数据。