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.
Заливка по методу Гуро
Сплошная заливка
|