zoukankan      html  css  js  c++  java
  • 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 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
    }

    颜色转换,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

    --

  • 相关阅读:
    使用wps跨ubuntu和windows编辑“.doc”文档。报错“编辑受限”,乱码,软件卡死,强制关闭
    【Python】断言功能Assertion
    【Python】hasattr() getattr() setattr() 使用方法详解
    【python】self & cls
    【Python】2.x与3​​.x版本的选用&版本间的区别
    【python】 del 的用法
    【python】参数中的*args和**kwargs
    解方程AX=b与矩阵分解:奇异值分解 特征值分解 QR分解 三角分解 Cholesky分解
    【python】dist-packages和site-packages的区别
    【python】脚本连续发送QQ邮件
  • 原文地址:https://www.cnblogs.com/graphics/p/1816170.html
Copyright © 2011-2022 走看看