Введение в программирование трехмерных игр с DX9

       

Материалы


Цвет объектов, которые мы видим в реальном мире, определяется цветом отражаемого ими света. Например, красный шар выглядит красным потому что он поглощает все лучи света, кроме красных. Красный свет отражается от шара и попадает в глаз зрителя, и поэтому мы считаем, что шар красный. В Direct3D данное явление моделируется путем задания материала объекта. Материал позволяет задать отражающую способность поверхности. В коде материал представляется с помощью структуры D3DMATERIAL9.

typedef struct _D3DMATERIAL9 { D3DCOLORVALUE Diffuse, Ambient, Specular, Emissive; float Power; } D3DMATERIAL9;

Diffuse — Задает количество отражаемого поверхностью рассеиваемого света.

Ambient — Задает количество отражаемого поверхностью фонового света.

Specular — Задает количество отражаемого поверхностью отражаемого света.

Emissive — Данный компонент позволяет увеличивать значения цветов, что создает эффект свечения поверхности.

Power — Задает резкость зеркальных отражений; чем больше значение, тем более резкими будут отражения.

Предположим. для примера, что мы хотим создать красный шар. Мы должны определить материал шара таким образом, чтобы он отражал только красную составляющую света, а все остальные поглощал:

D3DMATERIAL9 red; ::ZeroMemory(&red, sizeof(red)); red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // красный red.Ambient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // красный red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // красный red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); // нет свечения red.Power = 5.0f;

Здесь мы присваиваем зеленой и синей составляющим 0, указывая, что материал полностью поглощает лучи света данных цветов. Красной составляющей мы присваиваем значение 1, а это значит, что лучи данного цвета полностью отражаются поверхностью. Обратите внимание,что мы можем контроллировать степень отражения для каждой составляющей освещения (фоновой, рассеиваемой и отражаемой).

Также обратите внимание, что если мы создаем источник света испускающий лучи только синего цвета, то результат освещения данного шара может нас разочаровать, поскольку шар полностью поглощает лучи синего цвета а лучи красного цвета на него не попадают. Если объект поглощает все падающие на него лучи света, то он выглядит черным. Точно так же если объект полностью отражает все лучи (красный, синий и зеленый), то он выглядит белым. Поскольку ручное задание параметров материалов является скучным занятием, мы добавим в файлы d3dUtility.h/cpp несколько вспомогательных функций и глобальных констант материалов:

D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p) { D3DMATERIAL9 mtrl; mtrl.Ambient = a; mtrl.Diffuse = d; mtrl.Specular = s; mtrl.Emissive = e; mtrl.Power = p; return mtrl; }

namespace d3d { . . . D3DMATERIAL9 InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p);

const D3DMATERIAL9 WHITE_MTRL = InitMtrl(WHITE, WHITE, WHITE, BLACK, 8.0f);

const D3DMATERIAL9 RED_MTRL = InitMtrl(RED, RED, RED, BLACK, 8.0f);

const D3DMATERIAL9 GREEN_MTRL = InitMtrl(GREEN, GREEN, GREEN, BLACK, 8.0f);

const D3DMATERIAL9 BLUE_MTRL = InitMtrl(BLUE, BLUE, BLUE, BLACK, 8.0f);

const D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 8.0f); }

ПРИМЕЧАНИЕ

По адресу http://www.adobe.com/support/techguides/color/colortheory/main.html находится замечательная статья, посвященная теории цвета, освещению и тому, как человеческий глаз различает цвета.
В структуре данных вершины нет членов данных для задания свойств материала; вместо этого нам надо задать используемый материал с помощью метода IDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9* pMaterial).

Если мы хотим визуализировать несколько объектов, используя различные материалы, нам надо написать следующее:

D3DMATERIAL9 blueMaterial, redMaterial;

...// инициализация структур материалов

Device->SetMaterial(&blueMaterial); drawSphere(); // синяя сфера

Device->SetMaterial(&redMaterial); drawSphere(); // красная сфера


Содержание раздела