4. Цвет

    В Direct3D есть два способа задания цвета. Первый из них - структура D3DCOLOR. В этом случае, для хранения интенсивности цвета используется 32 разряда, по 8 разрядов на каждую из составляющих (красный, синий, зеленый), и ещё 8 разрядов на альфа-канал. Таким образом, значения интенсивности всех составляющих цвета лежат в диапазоне от 0 до 255.
    Вот как эта структура описана в DirectX SDK:

    typedef struct D3DXCOLOR
    {
    public:
       D3DXCOLOR() {}
       D3DXCOLOR(DWORD argb);
       D3DXCOLOR(CONST FLOAT *);
       D3DXCOLOR(CONST D3DXFLOAT16 *);
       D3DXCOLOR(CONST D3DCOLORVALUE&);
       D3DXCOLOR(FLOAT r, FLOAT g, FLOAT b, FLOAT a);
       operator DWORD () const;
       operator FLOAT* ();
       operator CONST FLOAT* () const;
       operator D3DCOLORVALUE* ();
       operator CONST D3DCOLORVALUE* () const;
       operator D3DCOLORVALUE& ();
       operator CONST D3DCOLORVALUE& () const;
       D3DXCOLOR& operator += (CONST D3DXCOLOR&);
       D3DXCOLOR& operator -= (CONST D3DXCOLOR&);
       D3DXCOLOR& operator *= (FLOAT);
       D3DXCOLOR& operator /= (FLOAT);
       D3DXCOLOR operator + () const;
       D3DXCOLOR operator - () const;
       D3DXCOLOR operator + (CONST D3DXCOLOR&) const;
       D3DXCOLOR operator - (CONST D3DXCOLOR&) const;
       D3DXCOLOR operator * (FLOAT) const;
       D3DXCOLOR operator / (FLOAT) const;
       friend D3DXCOLOR operator * (FLOAT, CONST D3DXCOLOR&);
       BOOL operator == (CONST D3DXCOLOR&) const;
       BOOL operator != (CONST D3DXCOLOR&) const;
       FLOAT r, g, b, a;
    } D3DXCOLOR, *LPD3DXCOLOR;

    Другим способом представления цвета является структура D3DCOLORVALUE. При таком задании, значения компонент цвета лежат в пределах от 0 до 1.

    typedef struct _D3DCOLORVALUE {
       float r;
       float g;
       float b;
       float a;
    } D3DCOLORVALUE;

    Добавим к нашей структуре с данными о точке поле, хранящее её цвет.

    struct ColorVertex {
       float x, y, z;
       D3DCOLOR color;
       static const DWORD FVF;
    }
    const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

    Последнее, что нужно сделать - указать каким способом будет произведена заливка грани цветом. Стоит заметить, что при сплошной заливке, грань красится в цвет точки с начальным индексом.

    //Сплошная заливка
    pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
    //Заливка методом Гуро
    pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);

    Пример приложения: "Цветной куб"
    Смена метода заливки осуществляется клавишами F1 и F2.


Заливка по методу Гуро


Сплошная заливка