日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D3DCOLOR与D3DXCOLOR

發布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D3DCOLOR与D3DXCOLOR 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

D3DCOLOR

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

  • D3DCOLOR_ARGB(a,r,g,b) - 第一個byte表示Alpha值,后面三個byte本別表示紅,綠,藍。
  • D3DCOLOR_RGBA(r,g,b,a) - 前三個byte分別表示紅,綠,藍,最后一個byte是Alpha值
  • D3DCOLOR_XRGB(r,g,b) - Alpha值為1,三個byte分別表示紅,綠,藍
  • D3DCOLOR_XYUV(y,u,v)? - 沒用過,不熟悉,暫不介紹
  • D3DCOLOR_AYUV(a,y,u,v) - 沒用過,不熟悉,暫不介紹
  • D3DCOLOR_COLORVALUE(r,g,b,a) - 與D3DCOLOR_RGBA(r,g,b,a)類似,不同的是參數都是浮點值,范圍[0.0-1.0]
// 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

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;

D3DCOLOR與D3DXCOLOR的轉換

一般來說,兩者基本可以互換使用

  • 任何使用D3DCOLOR的地方可以直接使用D3DXCOLOR,因為D3DXCOLOR重載了()運算符,可以直接轉換為D3DCOLOR
  • 任何使用D3DXCOLOR的地方可以直接使用D3DCOLOR,因為D3DXCOLOR有一個構造函數以D3DCOLOR為參數

假設有一個函數SetColor,接受一個D3DCOLOR參數

void SetColor(D3DCOLOR) ;

則可以使用下面這些方法調用這個函數,所有方法都將顏色設置為紅色

void Test() {SetColor(0xffff0000) ;SetColor(D3DCOLOR_ARGB(255, 255, 0, 0)) ; // Use decimalSetColor(D3DCOLOR_ARGB(0xff, 0xff, 0, 0)) ; // Use hexadecimalSetColor(D3DCOLOR_RGBA(255, 0, 0, 255)) ;SetColor(D3DCOLOR_XRGB(255, 0, 0)) ;SetColor(D3DCOLOR_COLORVALUE(1, 0, 0, 1)) ;SetColor(D3DXCOLOR(0xffff0000)) ; // Use D3DXCOLORSetColor(D3DXCOLOR(1.0f, 0, 0, 1.0f)) ; // Use D3DXCOLOR }

顏色轉換,float <->DWORD

在DirectX程序中有些地方用DWORD(RGBA)格式表示顏色,其范圍是[0 - 255],在shader中則都以float來表示顏色,其范圍是[0.0 - 1.0],兩者間的轉換規則如下:

  • DWORD -> float??? 將DWORD除以255
  • float? -> DWORD?? 將float值乘以255

舉個例子,127 / 255 = 0.5,0.1 * 255 = 25

--

轉載于:https://www.cnblogs.com/graphics/archive/2010/09/02/1816170.html

總結

以上是生活随笔為你收集整理的D3DCOLOR与D3DXCOLOR的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。