当前位置: 首页 > 文档资料 > DirectX 中文教程 >

调色板

优质
小牛编辑
159浏览
2023-12-01

调色板

返回上级

      1、什么是调色板?
      2、调色板的种类
      3、对非主页面设置调色板
      4、共享调色板
      5、调色板动画

什么是调色板?

返回目录

基于调色板的页面需要调色板才能真正有意义的显示出来。一个基于调色板的页面,通常也被称作一个“色彩索引”页面,仅仅是一些数字的集合,其中的每一个数字代表一个像素。每一个数字的值都对应于一个色彩表中的项,这个表告诉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以脱离同一调色板,则该调色板的引用记录只会递减一次。后来的调用不会影响调色板的引用记录。

调色板动画

返回目录

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

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

  1. 修改调色板的入口
  2. 在两个调色板之间切换

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

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