Рисунок 5.7. Окно приложения LitPyramid
Вот действия, которые необходимо выполнить, чтобы добавить к сцене источник света:
Разрешить освещение.
Создать материал для каждого объекта и задать используемый материал перед визуализацией соответствующего объекта.
Создать один или несколько источников света, расставить их на сцене и включить их.
Если необходимо, включить дополнительные режимы освещения, например, обработку отражаемого света.
Сперва мы объявляем глобальный буфер вершин в котором будут храниться данные вершин пирамиды:
IDirect3DVertexBuffer9* Pyramid = 0;
Весь код, относящийся к рассматриваемой в данной главе теме, находится в функции Setup, поэтому для экономии места остальные функции мы рассматривать не будем. В функции Setup реализованы перечисленные выше этапы добавления к сцене освещения. Начинается функция с разрешения использования освещения, которое не является необходимым, поскольку по умолчанию освещение разрешено (но хуже от этого не будет).
bool Setup() { Device->SetRenderState(D3DRS_LIGHTING, true);
Затем мы создаем буфер вершин, блокируем его и задаем данные вершин, образующих треугольную пирамиду. Нормали вершин вычисляются с помощью описанного в разделе 5.3 алгоритма. Обратите внимание, что хотя треугольники совместно используют некоторые вершины, нормали у каждого из них свои; так что использование для данного объекта списка индексов не принесет никакой пользы. Например, все грани используют вершину (0, 1, 0), находящуюся на верху пирамиды; однако нормаль этой вершины у каждого треугольника указывает в своем направлении.
Device->CreateVertexBuffer( 12 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &Pyramid, 0);
// Заполняем буфер вершин данными пирамиды Vertex* v; Pyramid->Lock(0, 0, (void**)&v, 0);
// передняя грань v[0] = Vertex(-1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f); v[1] = Vertex( 0.0f, 1.0f, 0.0f, 0.0f, 0.707f, -0.707f); v[2] = Vertex( 1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);