Как тень превращалась в объём

В Doom 3 тень не просто рисовалась поверх уже готовой картинки. Для каждого источника света движок определял, какие края модели отделяют освещённую сторону от неосвещённой, а затем мысленно вытягивал эти края от лампы сквозь сцену — далеко за пределы видимого пространства. Получалась невидимая «труба» тени, открытая в сторону бесконечности.

Такой подход называют теневыми объёмами: он описывает не плоскую тёмную область на стене, а пространство, куда свет не может попасть, потому что его перекрывает объект.

Как движок находил тёмные пиксели

Когда камера рисовала сцену, Doom 3 проверяла, проходит ли луч взгляда через этот объём тени. Для подсчёта использовался буфер трафарета — служебная область видеопамяти, которая ведёт счёт проходам через границы объёма. Если луч попадал внутрь, соответствующий участок изображения не получал вклад от данного источника света.

Поскольку объём можно было пересчитать при перемещении предмета или света, тени оставались динамическими: монстр мог заслонить лампу, а дверь — изменить освещение комнаты. Но за это приходилось платить вычислениями: подобную проверку нужно было выполнять для множества объектов и источников света.

Цена резкой тени

Метод давал чёткие границы и хорошо подходил для контрастных сцен Doom 3, где отдельные лампы выхватывают детали из темноты. Однако он описывал именно геометрическое перекрытие света: мягкость тени от большого источника требовала бы дополнительных приёмов. Вытягивание объёма до бесконечности позволяло не угадывать, где тень закончится на стене или полу: движок проверял, находится ли пиксель за перекрывшим свет объектом.