高级DirectDraw

 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.将所有资源释放
以上为结束部分

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值