最近在学并行计算时,需要用到directX中的D3DCOLOR这一类型,才发现一直没仔细研究过DirectX中的D3DCOLOR这一类型。查看其定义后发现其定义如下:
typedef DWORD D3DCOLOR;
其中DWORD类型的定义如下
typedef unsigned long DWORD;
是一个无符号型的长整数,(32位机器下)32位
在程序中对一个颜色赋值的时候习惯这样使用
D3DCOLOR color = D3DCOLOR_XRGB(0, 0, 255);//绿色
将D3DCOLOR_XRGB转到定义后发现这么一段代码
// maps unsigned 8 bits/channel to D3DCOLOR
#define D3DCOLOR_ARGB(a,r,g,b) \
((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
#define D3DCOLOR_RGBA(r,g,b,a) D3DCOLOR_ARGB(a,r,g,b)
#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)
从中D3DCOLOR_ARGB的定义可以看出它最后转化为D3DCOLOR类型值,并且注释了D3DCOLOR_ARGB中的四个变量分别对应颜色的四个通道:alpha, red, green, blue,其转化利用的是二进制的移位运算符<<和>>,在进行移位等操作后这四个参数分别占据了D3DCOLOR类型变量的四个字节,也就是D3DCOLOR的四个字节从高位到低位分别代表了颜色的alpha,red,green,blue通道。
比如现在有一个D3DCOLOR_ARGB(0,,255,192 ,128)在根据定义
// maps unsigned 8 bits/channel to D3DCOLOR
#define D3DCOLOR_ARGB(a,r,g,b) \
((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
进行计算:
然后将上面的四个结果进行或运算
最后得到的就是一个32位的无符号长整型数,它的每8个字节表示一个颜色通道。