1.真彩色模式下工作
为什么很少用在3D引擎中
(1)计算速度的问题
(2)内存带宽
2.16位真彩色模式
16位模式有许多可能的位编码技术:
(1)Alpha5.5.5 --这种模式用D15位存储一个Alpha值(表示是否透明),其余15位均匀分配给红色5位,绿色5位,蓝色5位。这样每种色彩产生的
变换为32,每个调色板有32的三次方种变换。
(2)X.5.5.5 -- 这种模式同Alpha.5.5.5类似,只是MSB(最高位)没有用。依然是每种色彩有32种变化
(3)5.6.5 -- 这是16位色彩最常见的模式,当然是5位给红色,6位给绿色,5位给兰色,所以共有65536种色彩。为什么绿色6位呢?因为人的眼
睛对绿色最为敏感,所以拓宽了绿色的位数。
3.如何建立16位RGB色彩的编码方式
可以通过简单的位移或者屏蔽操作来完成这个任务
#define _RGB16BIT555(r,g,b) ((b%32)+(g%32)<<5+(r%32)<<10)
红色在高5位,绿色在中间5位,兰色在最后5位
4获取像素格式:
IDIRECTDRAWSURFACE7::GetPixelFormat()
在访问DDPIXELFORMAT的大小之前,必须设置dwSize。 调用后,dwFlages和dwRGBBitCount才有效,包含有标志和RGB位数信息。
较重要的dwFlags标志:
DDPF_PALETTEINDEXED8--它标志着画面的色彩采用的是8位模式
DDPF_RGB--它标志着画面色彩采用的是RGB模式,其格式可以通过dwRGBBitCount查询
示例程序:
LPDIRECTDRAWSURFACE4 lpdds_primary;//assume this is valid
//clear our structure
memset(&ddpixel,0,sizeof(ddpixel));
//set length
ddpixel.dwSize = sizeof(ddpixel);
//make call off surface(assume primary this time)
lpdds_primary->GetPixelFormal(&ddpixel)
//now perform tests
//check if this is an RGB mode or palettized
if(ddpixel.dwFlags&DDPF_RGB)
{
//RGB mode
//what's the RGB mode
switch(ddpixel.dwRGBBitCount)
{
case 15://must be 5.5.5 mode
{}break;
case 16://must be 5.6.5 mode
{}break;
case 24://must be 8.8.8 mode
{}break;
case 32://must be alpha(8).8.8.8 mode
{}break;
default: break;
}
}
else
if(ddpixel.dwFlags&DDPF_PALETTEINDEXED8)
{}
else
{}
代码相当简单哈哈,有点难看,但是好用。当你以窗口模式创建主画面,并没有进行视频模式设置的时候,你就会发现GetPixelFormat()函数
的真正威力。那时,你会对视频的性质无所适从,从而不得不查询系统。另外,你也不知道色彩深度、像素格式或者系统的分辨率。
5绘制像素的步骤
(1).锁定主画面
(2)得到ddsd.lpSurface
(3)写入显示缓冲区
(4)解锁
6.学写一个宏定义:
#define DDRAW_INPUT_STRUCT(ddstruct) {memset(&ddstruct,0,sizeof(ddstruct));ddstruct.dwSize=sizeof(ddstruct);}
这是一个简单的宏,将结构初始为0,设置dwSize标志位;注意宏必须写成一行。
7.在一个游戏循环中,起基本原则是在进行操作之前对画面锁定一次,然后完成操作后解锁一次。所以一个函数如果会被频繁调用那一定不能
涉及锁定画面的操作。
8.在程序中,我们应该多利用移位加法来去掉乘法。
如y*512+y*128 = (y<<9)+(y<<7)
总结一下使用DirectDraw 16位真彩色的步骤:
1.创建一个DirectDraw对象
2.调用方法使该对象与窗体协作
3.设置显示模式
4.初始化主画面结构
5.创建主画面
以上是对界面的初始化
6.初试化主画面结构
7.设置RGB结构的构成,设置需要绘像素的位置
8.得到lpitch,lpsurface
9.将相应颜色写入相应位置的显示缓冲区中
以上为主要绘画部分
10.将所有资源释放
以上为结束部分