游戏开发新手入门之调色板和像素

2008-04-09 04:03:05来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  简介

  今天我们将分别使用调色板和RGB模式来熟悉DirectDraw的基本图形。它们有什么不同呢?如果你曾经在DOS下编程,你可能使用过调色板映射模式。调色板是个颜色查询表,为了绘制象素,你将一个单独的字节写入视频内存,通过这个字节你可以索引到一个拥有各种颜色的链表,这个颜色的链表,或查询表就叫作调色板。而RGB模式是不同的,因为它不需要颜色查询表。在RGB模式下绘制一个象素,你可以直接把红色、绿色和蓝色的值写入视频内存。任何色彩深度高于8位的调色板都可以用RGB模式取代。

  编写本文时,我假设你已经读过了前面几章,知道了怎样设置DirectDraw和创建表面。我们将使用DirectX7,它包含了最新的DirectDraw接口。实际上,DirectX 7 中的DirectDraw接口可能是最后的升级版本了!不用担心,未来的版本一定会兼容它的,但是未来可能是一个DirectDraw和Direct3D综合的产品,管它那,我们学的不会没有用的。

  在开始前我还有最后一件事要提醒你:在我的后续文章中关于调色板的部分可能再也用不到了,所以,如果你对于调色板模式不是很感兴趣,你可以跳过文章的前一部分,从象素格式开始看起。调色板的开发和使用是PC中使用的原始视频系统的内存限制带来的直接后果。现在由于充足的显存使调色板模式几乎废弃不用了。值得保留调色板模式的一个原因是,执行调色板操作可以实现一些有趣的动画效果。不罗嗦了,让我们开始吧!

  创建DirectDraw的调色板

  当你在色彩深度为8位或低于8位的模式下显示图形时,你必须创建调色板,也就是颜色查询表。更明确的讲,对于DirectX,调色板就是PALETTEENTRY结构。要建立一个调色板,我们要做如下三步:

  1、 创建颜色查询链表。

  2、 得到指向IDirectDrawPalette接口的指针。

  3、 把调色板链接到DirectDraw表面。

  我假设我们使用的是8位色彩深度。如果你要用16位或更高位的色彩深度编写游戏,你就不用继续看以下这段疯狂的Windows素材了。总之,8位色彩深度,我们可以有一个256个条目的调色板。所以,创建颜色查询链表,有256个条目在其中:

typedef struct tagPALETTEENTRY {
 // pe
 BYTE peRed;
 BYTE peGreen;
 BYTE peBlue;
 BYTE peFlags;
} PALETTEENTRY;
  头三个参数很明显,分别是红色、绿色和蓝色的强度。每一个取值范围0-255,BYTE是无符号数据类型。最后一个参数是控制标志,应该设置为PC_NOCOLLAPSE。原因我就不说了。

  现在,我们需要把256个条目有秩序的排列好,也就是为了一下能找到,我们为链表设置一个数组,象这样:

PALETTEENTRY palette[256];
  Ok,我们有了数组了,你可以装载颜色了。当我工作在调色板模式下时,通常把颜色存储在一个外部文件里,然后用一些如下的东东装载颜色:

FILE* file_ptr;
int x;

if ((file_ptr = fopen("palette.dat", "rb")) != NULL)
{
 fread(palette, sizeof(PALETTEENTRY), 256, file_ptr);
 fclose(file_ptr);
}
  All right,第一步完成了。现在我们需要得到调色板的接口。交给IDirectDraw7::CreatePalette()函数就好了:

HRESULT CreatePalette(
 DWORD dwFlags,
 LPPALETTEENTRY lpColorTable,
 LPDIRECTDRAWPALETTE FAR *lplpDDPalette,
 IUnknown FAR *pUnkOuter
);
  返回类型是HRESULT,你知道它的,所以可以用FAILED()和SUCCEEDED()这两个宏检测函数是否调用成功。参数的说明如下:

  ※ DWORD dwFlags:描述调色板对象的标志常量。当然,你可以用“|”组合它们:

   · DDPCAPS_1BIT:1位色彩,对应2色调色板。

   · DDPCAPS_2BIT:2位色彩,对应4色调色板。

   · DDPCAPS_4BIT:4位色彩,对应16色调色板。

   · DDPCAPS_8BIT:8为色彩,对应256色调色板。

   · DDPCAPS_8BITENTRIES:指出引用一个8位色彩索引。就是说,每个颜色条目是它本身的到目的表面8位调色板的索引。这叫作被变址的调色板。它必须同DDPCAPS_1BIT、DDPCAPS_2BIT,或者DDPCAPS_4BIT合用。乱套吧!^_^

   · DDPCAPS_ALPHA:每一个PALETTEENTRY的peFlags成员都应该被认为是阿尔发值。用这些标志创建的调色板可以被粘贴在Dierct3D纹理表面,因为DirectDraw本身并不支持阿尔发混合。

   · DDPCAPS_ALLOW256:允许8位调色板的全部256个条目被使用。通常,0指向黑色,255指向白色。

   · DDPCAPS_INITIALIZE:指出应该用PALETTEENTRY的数组初始化调色板。

   · DDPCAPS_PRIMARYSURFACE:调色板将链接到主表面,好快速更改显示颜色。

   · DDPCAPS_VSYNC:一般画圆时用到它。

  大多数情况,你将使用DDPCAPS_8BIT | DDPCAPS_INITIALIZE,如果你刚好想建立一个空的调色板,稍后再设置它,你可以去掉后者,就是DDPCAPS_INITIALIZE。当然,你还可以使用DDPCAPS_ALLOW256,如果你真的想改变这两个常用的条目。

  ※ LPPALETTEENTRY lpColorTable:这个指针指向我们创建的查询表,把数组的名称传递给它就好了。

  ※ LPDIRECTDRAWPALETTE FAR *lplpDDPalette:这是指向IDirectDrawPalette接口指针的地址。如果函数调用成功,它将被初始化。

  ※ IUnkown FAR *pUnkOuter:同以前一样,这总是为COM高级应用准备的。设置为NULL好了。

  不是太糟糕吧!现在我们可以建立我们的调色板对象了。最后一步是把调色板链接到一个表面,这只需要一个函数就好了——IDirectDrawSurface7::Setpalette()。它的原形如下:

HRESULT SetPalette(LPDIRECTDRAWPALETTE lpDDPalette);
  很简单,是不是?你只要把上一步得到的接口指针传递给它就可以了。那好,让我们把学到的综合到一起,下面我给你一个程序框架,我假设我们已经利用调色板的数组建立了一个索引链表,就像我们上一步做的。该框架是建立DirectDraw调色板来控制颜色,并且把它链接到主表面(当然,主表面是我们事先做好的):

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:欣赏优美的代码:实际的例子

下一篇:游戏中的现代音频技术综述