更新时间:2022-09-23 08:20:31
D3DCOLOR实际上是一个DWORD,看一下它的定义(位于d3d9types.h中)
// D3DCOLOR is equivalent to D3DFMT_A8R8G8B8
#ifndef D3DCOLOR_DEFINED
typedef DWORD D3DCOLOR;
#define D3DCOLOR_DEFINED
#endif
在这个DWORD中,第一个byte表示Alpha值,后面三个byte依次是r(红)g(绿)b(蓝)值。见下图
在d3d9types.h还定义了几个关于颜色的宏,可以将8bit/channel转换成D3DCOLOR
// 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)
#define D3DCOLOR_XYUV(y,u,v) D3DCOLOR_ARGB(0xff,y,u,v)
#define D3DCOLOR_AYUV(a,y,u,v) D3DCOLOR_ARGB(a,y,u,v)
// maps floating point channels (0.f to 1.f range) to D3DCOLOR
#define D3DCOLOR_COLORVALUE(r,g,b,a) \
D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((b)*255.f),(DWORD)((a)*255.f))
D3DXCOLOR比D3DCOLOR更强大,它是一个类,有丰富的构造函数,多个类型转换函数,也可以方便的进行各种与颜色有关的算术运算。
typedef struct D3DXCOLOR
{
#ifdef __cplusplus
public:
D3DXCOLOR() {}
D3DXCOLOR( DWORD argb );
D3DXCOLOR( CONST FLOAT * );
D3DXCOLOR( CONST D3DXFLOAT16 * );
D3DXCOLOR( CONST D3DCOLORVALUE& );
D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a );
// casting
operator DWORD () const;
operator FLOAT* ();
operator CONST FLOAT* () const;
operator D3DCOLORVALUE* ();
operator CONST D3DCOLORVALUE* () const;
operator D3DCOLORVALUE& ();
operator CONST D3DCOLORVALUE& () const;
一般来说,两者基本可以互换使用
假设有一个函数SetColor,接受一个D3DCOLOR参数
void SetColor(D3DCOLOR) ;
则可以使用下面这些方法调用这个函数,所有方法都将颜色设置为红色
void Test() { SetColor(0xffff0000) ; SetColor(D3DCOLOR_ARGB(255, 255, 0, 0)) ; // Use decimal SetColor(D3DCOLOR_ARGB(0xff, 0xff, 0, 0)) ; // Use hexadecimal SetColor(D3DCOLOR_RGBA(255, 0, 0, 255)) ; SetColor(D3DCOLOR_XRGB(255, 0, 0)) ; SetColor(D3DCOLOR_COLORVALUE(1, 0, 0, 1)) ; SetColor(D3DXCOLOR(0xffff0000)) ; // Use D3DXCOLOR SetColor(D3DXCOLOR(1.0f, 0, 0, 1.0f)) ; // Use D3DXCOLOR }
在DirectX程序中有些地方用DWORD(RGBA)格式表示颜色,其范围是[0 - 255],在shader中则都以float来表示颜色,其范围是[0.0 - 1.0],两者间的转换规则如下:
举个例子,127 / 255 = 0.5,0.1 * 255 = 25
--
本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2010/09/02/1816170.html,如需转载请自行联系原作者