Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1851015
  • 博文数量: 343
  • 博客积分: 10342
  • 博客等级: 上将
  • 技术积分: 2892
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 12:34
个人简介

你必须非常努力,才能看起来毫不费力!

文章存档

2012年(3)

2011年(5)

2010年(2)

2009年(40)

2008年(293)

分类: WINDOWS

2009-08-07 14:41:08

什么是调色板?

基于调色板的页面需要调色板才能真正有意义的显示出来。一个基于调色板的页面,通常也被称作一个“色彩索引”页面,仅仅是一些数字的集合,其中的每一个数字代表一个像素。每一个数字的值都对应于一个色彩表中的项,这个表告诉DirectDraw对这个像素使用什么样的颜色。 DirectDrawPalette对象,通常简称为“调色板”,给你提供了一个及其方便的途径来管理调色板。那些使用16位或更高位像素格式的页面并不使用调色板。

提供DirectDrawPalette对象是为了拥有直接操作16和256色调色板的特性(一个 DirectDrawPalette对象通常与一个DirectDrawSurface对象相依属)。一个DirectDrawPalette对象保留了一个从0到255的256色调色板的入口;它不保留16色调色板的任何入口。它允许直接对色彩表(color table)的直接操作。一个色彩表是一系列颜色值(典型的是RGB三个一组)。这个表可以包含16或24位的RGB色彩入口,代表与每一个索引相对应的颜色。对16色调色板来说,色彩表可以包含另一个256色调色板的索引。

调色板被材质图、离屏页面、覆盖页面所支持,它们并不需要与主页面拥有同样的调色板。

你可以通过调用IDirectDraw2::CreatePalette函数来创建一个调色板。该函数将返回一个指向IdirectDrawPalette 接口的调色板对象的指针。你可以使用该接口的函数来操作调色板入口、获得关于调色板对象能力的信息、或初始化该对象(如果你用的是 CoCreateInstance函数创建的它)。

你可以通过调用IDirectDrawSurface3::SetPalette函数将一个调色板连接到一个页面上。一个调色板可以被连接到若干个页面。

通过调用IDirectDrawPalette::GetEntries,应用程序可以获得这些表的入口,并且可以通过IDirectDrawPalette::SetEntries改变这些入口。这个函数有一个dwFlags参数,指定对于调色板的改动是否立即生效。

DirectDrawPalette对象为一个8位的调色板保留了从0到255的入口,除非你指定了DDPCAPS_ALLOW256标志请求所有这些入口都可以被你所用。

SDK中的Ddutil.cpp源文件包含了一些关于操作调色板的唾手可得的应用程序定义的函数(非库函数)。要得到更多的信息,请参阅源文件中的DDLoadPalette函数。


--------------------------------------------------------------------------------

调色板的种类

DirectDraw 支持1位(2个入口)、2位(4个入口)、4位(16个入口)、和8位(256个入口)的调色板。一个调色板只能依附于符合其像素格式的页面。例如,一个由DDPCAPS_1BIT标志创建的2入口(2-entry)的调色板只能被依附于一个由DDPF_PALETTEINDEXED1标志创建的1位(1-bit)页面。

除此之外,你可以创建一个不包含色彩表的调色板,这就是“索引调色板(indexed palettes)”。一个索引调色板是指:其入口并不包含RGB色彩值,而是另一个调色板的PALETTEENTRY结构的索引值。一个索引调色板的色彩表(color table)是一个2、4、16、256字节的序列,每一个字节是另一个调色板的索引。

要创建一个索引调色板,在调用 IDirectDraw2::CreatePalette时指定DDPCAPS_8BITENTRIES标志。例如,要创建一个4位的索引调色板,指定 DDPCAPS_4BIT |DDPCAPS_8BITENTRIES。当你创建一个索引调色板,传递一个指向一系列字节的指针,而不是一个指向PALETTEENTRY结构的指针。当你使用IDirectDraw2::CreatePalette时,必须将一个指向字节组的指针转换成LPPALETTEENTRY类型。

注意:在Blit操作的过程中,DirectDraw不会解除索引调色板,而使其成为普通调色板。


--------------------------------------------------------------------------------

对非主页面(Non-Primary Surfaces)设置调色板

调色板可以依属于任何一种基于调色板的页面(主页面,后台缓存,离屏平面,或材质图)。只有那些被依属到主页面(primary surface)的调色板才能对系统调色板(system palette)产生影响。注意到这一点是很重要的:DirectDraw位图映射决不会导致色彩转换;任何依属于源或目标页面的调色板在位图映射中被忽略。此外,IDirectDrawSurface3::GetDC函数同样忽略被选入页面的任何DirectDrawPalette对象。

非主页面调色板可以被应用程序或Direct3D(或其它3D渲染引擎)所使用。


--------------------------------------------------------------------------------

共享调色板

调色板可以被多个页面所共享。同一个调色板可以设置给一个换页链的前台缓存(front buffer)和后台缓存(back buffer),或在多个材质页面中共享。当应用程序调用IDirectDrawSurface3::SetPalette使一个调色板依属于一个页面,页面将递增该调色板的引用记录(reference count)。当页面的引用记录达到0时,页面将递减依属于它的该调色板的引用记录。除此之外,如果通过 IDirectDrawSurface3::SetPalette使调色板脱离页面,则该调色板的引用记录将减1。

注意:如果对同一页面反复调用IDirectDrawSurface3::SetPalette以脱离同一调色板,则该调色板的引用记录只会递减一次。后来的调用不会影响调色板的引用记录。


--------------------------------------------------------------------------------

调色板动画

调色板动画指的是:用修改隶属于一个页面的调色板的方法来实现显示页面色彩的变化,而不是通过实际修改页面的内容来实现页面的变化。为了这个目的,调色板动画给你提供了一个不需要改变页面内容,改变页面所显示的图象的途径,而只会产生很少的消耗。

有两种方法可以直接实现调色板动画:

修改调色板的入口
在两个调色板之间切换
你可以使用以下两种方法之一来实现简单的调色板动画。前一个方法:改变为实现动画所需要改变颜色的调色板入口。这种方法,你可以通过调用 IDirectDrawPalette::SetEntries来实现调色板的重置。第二个方法需要两个DirectDrawPalette对象。应用程序通过轮流将两个DirectDrawPalette与DirectDrawSurface对象相依属,来实现动画。这种方法,你可以通过调用 IDirectDrawSurface3::SetPalette来实现。

没有一种技术会使硬件产生激烈反应,所以,你可以随心所欲的选择适合于你的程序的那种。
----------------------------------------------------------------------------

我们知道,在256色的显示模式下,显示器在同一时刻最多显示256种颜色,而自然界的颜色是数不胜数的,它究竟该显示哪256种颜色呢?为了充分运用这宝贵的256种颜色,很多256色的图像文件都把自己最需要的256种颜色找出来,放到了一个颜色表中,只要有了这个表中列出的256种颜色,这个图像就可以达到它的最佳显示效果。这个保存了图像所需的256种颜色的颜色表就是这个图像的调色板。

每一个256色图像都有自己对应的调色板,如果显示这个图像时用了别的图像的调色板,图像就有可能变花。

Windows95/98有一个系统调色板,这个调色板中包含了Windows95/98中使用最多的256种颜色,但这些颜色只能保证Windows95/98自己的正常显示,如果我们要运行一些多媒体软件,由于这些软件通常都有自己的调色板,在它们正常显示时,Windows95/98的桌面和一些界面就会变花。这些都是正常的现象,也是256色显示模式的一个局限性。

有时我们需要把一幅真彩色的图像文件转换为256色,这个工作有很多软件都可以做,我们最常用的是PHOTOSHOP。PHOTOSHOP可以计算出图像所需的最佳调色板,也允许我们为图像指定一个调色板。用指定的调色板来转换256色图像这一功能非常有用,在制作多媒体软件时,我们经常需要使很多张图使用同一个调色板,这样才能保证在256色显示模式下不出现花屏。

阅读(2212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~