В прошлых уроках мы уже перешли в трехмерное
пространство, но как вы видели - оно получилось каким то странным, темным и не
понятным. Все дело в том, что мы просто создали трехмерный объект и начали его
вращать в трехмерной сцене. Для получения нормального изображения трехмерной
сцены нам необходимо сделать ее более реалистичной. Для этого необходимо
использовать источники света для освещения и материалы для объектов сцены. Тогда
у нас получится уже вполне реальная и наглядная трехмерная сцена, по которой
будет видно, что мы сделали действительно что то трехмерное и красивое.
Начнем с источников света. Для того что бы они
начали работать нам необходимо их создать и задать необходимые параметры. Но для
начала нужно снова изменить формат наших вершин, нам прийдется для каждой
вершины кроме ее трех координат задать еще три координаты для вектора нормали к
данной вершины. Нормали необходимы для расчета правильного освещения заданной
грани.
Вот новое объявление наших вершин :
Мы задали шесть координат - три для координат
положения, и еще три для вектора нормали.
Далее создадим какой ни будь красивый трехмерный
объект. Для данного примера я использовал такую вот штуку :
Теперь собственно возьмемся за тему данного урока.
Для начала создадим два материала :
Я создал две глобальных структуры для описания
материалов, и задал им необходимые параметры, а конкретнее - задал цвет.
Теперь их уже можно использовать. Вот как выглядит
теперь функция отрисовки окна :
Почти все в этой функции вам уже известно.
Необходимо обратить внимание только на следующие строки :
Данным образом мы показываем D3D8 какой материал
нам необходимо использовать для отрисовки последующих объектов и отрисовываем
этот объект. Затем меняем материал и отрисовываем новый объект.
Но пока радоваться еще рано. Нам необходимо еще
создать и научиться использовать источники света.
Создадим теперь один источник освещения :
Я создал для этих целей еще одну переменную, для
хранения параметров источника освещения, и задал ему необходимые параметры -
такие, как тип источника, цвет света, направление (зависит от типа источника -
для направленного, как у нас, неоходимо направления, для точечного необходимы
координаты положения и т.д.), задали границу за которой не будет действовать
источник. После всего этого мы связаваем наш источник с идентификатором 0, и
говорим D3D8 о том, что источник света за нулевым идентификатором разрешен и
должен работать.
Но этого еще не достаточно. Еще необходимо задать
некоторые параметры для нашего D3D8 устройства :
Первое - мы говорим, что освещение разрешено и его
нужно обрабатывать. Второе - задаем цвет общего освещения (в данном случае 0 -
но вообще можно задать любое другое).
Все, теперь даннйы источник света работает. Но для
большей наглядности я создал одну функцию, в которой я меняю параметры источника
света (точнее его направление) и эффект использования освещения виден намного
лучше. Данную функцию я вызываю в функции обновления экрана - UpdateLights()
, а выглядит она следующим образом :
Вот теперь вроде все... Да, кстати - увидеть вы
должны нечто похожее на следующее :