netlib.narod.ru< Назад | Оглавление | Далее >

Камера, мотор, а где же свет?

Мы нарисовали треугольник и заставили его вращаться, как сделать его еще лучше? Конечно, с помощью освещения! Мы уже кратко упоминали освещение, когда при первом переходе к непреобразованным координатам треугольник был полностью черным. Тогда мы полностью выключили освещение для нашей сцены. Тепрь, чтобы все стало по прежнему, нам во-первых необходимо вернуть члену Lighting значение true:

device.RenderState.Lighting = true;

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

device.Lights[0].Type = LightType.Point;
device.Lights[0].Position = new Vector3();
device.Lights[0].Diffuse = System.Drawing.Color.White;
device.Lights[0].Attenuation0 = 0.2f;
device.Lights[0].Range = 10000.0f;
device.Lights[0].Enabled = true;

Что же делают все эти строки кода? Сначала мы определяем, какой тип источника света хотим отобразить. Мы выбрали точечный источник света, который испускает лучи равномерно во всех направлениях, подобно электрической лампочке. Есть также направленный источник света, который испускает параллельные лучи в заданном направлении. Вы можете думать о направленом источнике света как о солнце (да, в действительности Солнце должно считаться точечным источником света, поскольку светит во всех направлениях; однако с точки зрения находящихся на Земле оно ведет себя во многом подобно направленному источнику света). Направленный свет зависит только от направления и цвета и игнорирует все другие параметры (такие, как затухание и дальность распространения), поэтому его использование требует наименьшего количества вычислений. Последний тип источника света — это зональный свет или прожектор, который, согласно своему названию, используется для создания конусообразного светового потока, подобного лучу софита, освещающего артиста на сцене, который вы могли видеть на концертах. Зональный свет управляется большим количеством параметров (местоположение, направление, угол конуса и т.д.) и поэтому требует наибольшего количества вычислений.

Закончив краткое обсуждение типов источников света можно двигаться дальше. Теперь мы хотим задать местоположение нашего точечного источника света. Поскольку центр нашего треугольника находится в точке 0, 0, 0, там же можно разместить и источник света. Это делает конструктор Vector3 без параметров. Мы делаем рассеиваемую составляющую света белой, чтобы поверхность освещалась обычным образом. Мы устанавливаем первый коэффициент затухания, управляющий тем, как интенсивность света уменьшается с расстоянием. Диапазон действия источника света задает максимальное расстояние, на котором он оказывает эффект. В данном случае заданный диапазон значительно превышает наши потребности. Дополнительную информацию о математике освещения вы найдете в документации DirectX SDK (на прилагаемом к книге CD-ROM).

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

Если сейчас еще раз запустить приложение, вы увидите, что хотя мы и описали источники света в сцене, треугольник остался черным. Если наш источник света включен, но мы не видим свет, Direct3D не может осветить наш треугольник, и это действительно так. Но почему? Вычисление освещения может быть сделано только в том случае, если у каждой грани вашего объекта есть нормаль, а сейчас ее нет. Что такое нормаль? Нормаль (normal) — это перпендикулярный вектор, направленный от лицевой стороны грани, как показано на рис. 1.5.


Рис. 1.5. Нормаль

Рис. 1.5. Нормаль


Узнав об этом, давайте добавим к нашему треугольнику нормаль, чтобы мы смогли увидеть свет в вашей сцене. Простейший способ сделать это — заменить наш тип формата вершин на какой-нибудь, включающий нормаль. Для этого также есть встроенная структура. Замените код создания треугольника на следующий:

CustomVertex.PositionNormalColored[] verts=new CustomVertex.PositionNormalColored[3];
verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
verts[0].Normal   = new Vector3(0.0f, 0.0f, -1.0f);
verts[0].Color    = System.Drawing.Color.White.ToArgb();
verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
verts[1].Normal   = new Vector3(0.0f, 0.0f, -1.0f);
verts[1].Color    = System.Drawing.Color. White.ToArgb();
verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
verts[2].Normal   = new Vector3(0.0f, 0.0f, -1.0f);
verts[2].Color    = System.Drawing.Color. White.ToArgb();

Вдобавок нам надо изменить указываемый устройству формат вершин, в соответствии с новыми данными, так что обновите и следующую строку:

device.VertexFormat = CustomVertex.PositionNormalColored.Format;

Единственное большое отличие этого набора данных от предыдущего заключается в добавлении нормали и том, что цвет всех вершин теперь белый. Как видите, для каждой вершины мы определяем один вектор нормали, направленный перпендикулярно лицевой поверхности и от нее. Поскольку все наши вершины находятся в одной плоскости Z (Z = 1.0f) с различными координатами по осям X и Y, перпендикулярный вектор направлен вдоль отрицательного направления оси Z. Запустив теперь приложение вы снова увидите наш треугольник, но он будет освещен. Попробуйте изменить цвет рассеиваемой составляющей источника света и посмотрите, как это влияет на сцену. Обратите внимание, что если вы установите красный цвет, треугольник станет красным. Попробуйте поэкспериментировать с этим параметром, чтобы увидеть различные способы управления светом.

Следует помнить, что освещение вычисляется для вершин, поэтому в моделях с небольшим количеством полигонов (и для нашего единственного треугольника) освещение выглядит не слишком реалистично. В последующих главах мы обсудим более совершенные техники освещения, такие как попиксельное освещение. Они позволяют создавать более реалистичные сцены.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz