Свет и материалы (Direct3D 9)
Для освещения объектов в сцене используются источники света. Если освещение включено, Direct3D вычисляет цвет каждой вершины объекта на основе сочетания:
Примечание
Этот раздел предназначен только для конвейера фиксированной функции. Программируемые шейдеры выполняют все функции освещения явным образом.
- Текущий цвет материала и тексели в связанной карте текстур.
- Диффузные и отраженные цвета на вершине, если они заданы.
- Цвет и интенсивность света, производимого источниками света в сцене, или уровень фонового освещения сцены.
При использовании освещения и материалов Direct3D вы разрешаете Direct3D обрабатывать детали освещения. Опытные пользователи могут при необходимости заниматься освещением самостоятельно.
Способ работы с освещением и материалами сильно влияет на внешний вид отрисованной сцены. Материалы определяют, как свет отражается от поверхности. Уровни прямого и фонового освещения определяют, какой свет отражается. Если освещение включено, для отрисовки сцены необходимо использовать материалы. Для отрисовки сцены источники света не требуются, но компоненты в сцене без освещения не видны. В лучшем случае отрисовка неосвещенной сцены приведет к отображению силуэтов объектов сцены. Такой уровень детализации недостаточен для большинства целей.
Прямое и внешнее освещение
Несмотря на то что объекты в сцене получают и прямое, и фоновое освещение, они не зависят друг от друга, они оказывают очень различное действие и требуют совершенно различных подходов в работе.
Прямой свет это только то, что: прямой. Прямое освещение всегда имеет направление и цвет, и это является важным фактором для алгоритмов заливки, например для заливки Гуро. Различные типы источников света испускают прямой свет различными способами, создавая особые эффекты угасания. Чтобы создать набор параметров освещения для прямого света, вызовите метод IDirect3DDevice9::SetLight .
Фоновое освещение оказывает воздействие во всей сцене. Его можно рассматривать как общий уровень света, который заполняет всю сцену, независимо от объектов и их расположения в этой сцене. У фонового освещения нет расположения и направления, есть только цвет и интенсивность. Каждый источник света усиливает общее фоновое освещение сцены. Задайте уровень освещения окружающей среды с помощью вызова метода IDirect3DDevice9::SetRenderState , указав D3DRS_AMBIENT в качестве параметра State и требуемый цвет RGBA в качестве параметра Value.
Цвет фонового освещения принимает форму значения RGBA, где каждый компонент является целым числом от 0 до 255. Это отличает его от большинства значений цвета в Direct3D.
Для создания значений RGBA можно использовать макрос D3DCOLOR_RGBA . Красный, зеленый и синий компоненты сочетаются и создают окончательный цвет фонового освещения. Альфа-компонент определяет прозрачность цвета. При использовании аппаратного ускорения или эмуляции RGB альфа-компонент игнорируется.
Direct3D Light Model vs. Nature
По своей природе, когда свет испускается источником, он отражается от сотен, если не тысяч или миллионов объектов, перед тем как достичь глаз пользователя. Каждый раз, когда свет отражается, какая-то его часть поглощается поверхностью, другая рассеивается в случайных направлениях, а оставшийся свет попадает на другую поверхность или попадает в глаза пользователя. Этот процесс продолжается, пока уровень освещения не ослабнет до нуля или до восприятия света пользователем.
Очевидно, что вычисления, необходимые для абсолютно точного моделирования естественного освещения слишком сложны, чтобы использовать их в графике Direct3D в режиме реального времени. Таким образом, учитывая скорость обработки данных, модель освещения Direct3D приблизительно моделирует освещение реального мира. Direct3D описывает свет с помощью красного, зеленого и синего компонентов, которые в сочетании образуют окончательный цвет.
В Direct3D, когда свет отражается от поверхности, его цвет взаимодействует согласно математическим алгоритмам с самой этой поверхностью и создает цвет, который в конечном итоге отображается на экране. Конкретные сведения об алгоритмах, которые использует Direct3D, см. в разделе Математика освещения (Direct3D 9).
Модель освещения Direct3D разделяет свет на два типа: фоновое освещение и прямой свет. Каждому типу присущи различные характеристики, и каждый тип взаимодействует с материалом поверхности различными способами. Фоновое освещение — это свет, который был настолько рассеян, что его направление и источник невозможно определить: он проникает повсюду с низким уровнем интенсивности. Отраженный свет, используемый фотографами, является хорошим примером фонового освещения. Фоновое освещение в Direct3D, как и в природе, не имеет направления или источника, а имеет лишь цвет и интенсивность. На самом деле уровень фонового освещения совершенно независим от каких-либо объектов сцены, испускающих свет. Фоновое освещение не влияет на зеркальное отражение.
Прямой свет — это свет, созданный каким-либо источником в сцене, он всегда имеет цвет и интенсивность, а также распространяется в заданном направлении. Прямой свет взаимодействует с материалом поверхности и создает блики, а его направление используется в качестве коэффициента для алгоритмов заливки, включая заливку Гуро. При отражении прямого света он не влияет на уровень фонового освещения в сцене. Источники в сцене, создающие прямой свет, имеют различные характеристики, которые влияют на то, как они освещают сцену.
Кроме того, материал многоугольников имеет определенные свойства, которые влияют на то, как этот многоугольник отражает попадающий на него свет. Вы задаете одно свойство отражения, которое определяет, как этот материал отражает фоновый свет, а также задаете индивидуальные особенности, чтобы определить зеркальное и рассеивающее отражающие свойства материала. Дополнительные сведения см. в разделе Материалы (Direct3D 9).
Значения цветов для огней и материалов
Direct3D описывает цвет с точки зрения четырех компонентов: красного, зеленого, синего и альфа-, которые объединяются в окончательный цвет. Структура C++ D3DCOLORVALUE определяется так, чтобы она содержала значения для каждого компонента. Каждый член является значением с плавающей запятой, которое обычно находится в диапазоне от 0,0 до 1,0 включительно. Хотя и огни, и материалы используют одну и ту же структуру для описания цвета, значения в структуре используются немного по-разному.
Значения цвета для источников света определяют количество излучаемого им света. Поскольку для источников света не используется альфа-компонент, для них имеют значение только красный, зеленый и синий компоненты цвета. Эти три компонента можно представить как линзы красного, зеленого и синего цвета на проекторе. Каждую линзу можно снять (значение 0,0 для соответствующего члена), также ее интенсивность может быть максимально яркой (значение 1,0) либо иметь значение где-то между двумя этими пределами. Цвета, проходящие через линзы, сочетаются и образуют окончательный цвет освещения. Сочетание R(1,0), G(1,0), B(1,0) создает белый свет, тогда как сочетание B(0,0), R(0,0), G(0.0) не производит света вообще. Вы можете сделать источник света, излучающий только один компонент, что приведет к образованию чисто красного, зеленого или синего освещения; также можно использовать сочетания компонентов, чтобы образовать такие цвета, как, например, желтый или сиреневый. Вы можете даже задать отрицательное значение цвета для создания «темного света», который на самом деле ослабляет освещение в сцене. Также можно задать компонентам значение больше 1,0 для создания очень яркого света.
С другой стороны, у материалов значения цвета определяют, насколько интенсивно световой компонент отражается от поверхности, которая отрисовывается с использованием этого материала. Материал, цветовые компоненты которого имеют значения R(1,0), G(1,0), B(1,0), A(1,0), отражает весь попадающий на него свет. В свою очередь материал со значениями R(0,0), G(1,0), B(0,0), A(1,0) отражает весь попадающий на него зеленый свет. Материалы имеют несколько значений отражающей способности для создания различных эффектов.
Дополнительные сведения содержатся в следующих файлах: Типы света (Direct3D 9) и Свойства света (Direct3D 9) .
Связанные темы