Запекание света
Запекание света — это древняя, как экскременты мамонта, и священная, как первая Half-Life, технология, позволяющая игорям не тормозить на твоем калькуляторе. Суть ее сводится к тому, чтобы заранее, еще до того, как хомячок запустит игру, просчитать все тени и блики, а потом намертво «впечатать» их в текстуры. В результате твой GPU вместо того, чтобы в реальном времени корпеть над каждым лучиком, просто показывает уже готовую картинку. Просто, дешево и сердито. Идеально для тех, кто до сих пор верит, что 30 FPS — это «кинематографично».
Шаманство с текстурами[править]
Анонимус, представь, что ты — бог-демиург своего собственного мирка в Unreal Engine. Ты расставил лампочки, повесил солнце, но если оставить все как есть, то даже топовая видеокарта завоет от натуги, пытаясь обсчитать весь этот праздник фотонов в реальном времени. Тут-то на помощь и приходит запекание. Эта технология, известная еще динозаврам геймдева, позволяет взять всю информацию об освещении и тенях и хитро запихнуть ее в отдельные каналы текстуры. И не надо тут умничать, что это «запекание теней». Это именно запекание всего света, потому что, как подсказывает нам Капитан Очевидность, тень — это, по сути, всего лишь отсутствие света. Просчитывается всё и сразу: где светло, где темно, где полутень от колонны, которую ты так криво поставил.
Эта магия работает уже давно и до сих пор используется в овердофига играх, потому что позволяет добиться красивой картинки без тотального геноцида производительности.
Развёртка: Когда твой 3D-стул превращают в выкройку[править]
Чтобы понять, как свет «ложится» на объект, нужно сначала понять, что такое развёртка (или, как говорят в приличных домах, UV mapping). У каждого полигонального меша, будь то футуристичное кресло или сраный куб, есть эта самая развёртка. Это, по сути, двухмерное представление его трёхмерной поверхности, как если бы ты аккуратно разрезал и разложил на столе шкурку от апельсина. Каждая вершинка (вертекс) 3D-модели получает свои координаты на этой плоской карте. Именно по этим координатам движок понимает, какой кусок текстуры на какой полигон натягивать. Это похоже на выкройку для шитья: у тебя есть плоский кусок ткани (текстура) и лекала (развёртка), по которым ты кроишь и сшиваешь объемную вещь (3D-модель).
И вот на такую же разложенную на плоскости «выкройку» объекта движок и начинает рисовать информацию об освещенности. Вместо цветастой текстурки кожи для кресла он создает так называемую лайтмапу (lightmap) — карту света.
Лайтмапы: Тени, которые не пересекаются[править]
А вот тут начинается самое интересное и полное ограничений. Главное отличие развертки для лайтмапы от обычной текстурной развертки в том, что ее элементы категорически не должны пересекаться. Если при текстурировании какой-нибудь растительности ты можешь взять один и тот же кусочек текстуры листика и наложить его на сто разных полигонов, экономя место, то со светом такой финт не пройдет. Каждый листочек, каждая веточка твоего куста освещается по-своему, под своим уникальным углом, а значит, и информация о свете для каждого полигона должна быть уникальной. Если на развертке два полигона будут лежать друг на друге, движок сойдет с ума, пытаясь понять, какую тень на них рисовать, и выдаст графический артефакт, от которого у эпилептика случится припадок. Поэтому для лайтмап создается отдельная, уникальная развертка, где каждый полигончик занимает свое, ни с кем не делимое место. PROFIT? Нет, сплошные страдания и долгое ожидание пересчета.
Почему нельзя просто так взять и добавить лампочку[править]
Думал, на этом боль заканчивается? Как бы не так. Главная засада запекания света — это жесткое ограничение на количество источников света. Поскольку информация о свете записывается в каналы стандартной текстуры, мы упираемся в их количество. В нашем распоряжении обычно четыре канала: красный (R), зеленый (G), синий (B) и альфа-канал (A). Соответственно, в одной точке пространства движок может запечь свет только от четырех пересекающихся источников.
Хочешь поставить пятую лампочку, чтобы осветить тот темный угол? А вот хрен тебе. Движок вежливо покажет на этом источнике света красный крестик позора и напишет в логах что-то вроде:
Preview lighting build failed. Failed to allocate shadowmap channel. For stationary light due to overlap — light will fall back to dynamic shadows!
Это означает, что для твоей пятой лампочки не нашлось свободного канала, и она будет работать в динамическом режиме, то есть обсчитываться в реальном времени, сводя на нет всю идею оптимизации. Таким образом, вся сцена превращается в головоломку: как четырьмя лампочками осветить всё, что нужно, и не вызвать гнев движка.
В итоге вся сложная световая картина сцены, включая свет от солнца (Directional Light) и нескольких точечных лампочек (Point Light), сжимается в одну невзрачную текстурку. Если посмотреть на нее по каналам, можно увидеть, как в красный канал записана тень от солнца, в зеленый — от одной лампочки, в синий — от другой, и так далее. Эти черно-белые маски и есть вся информация о свете и тени на уровне. Движок просто смешивает их с основными текстурами, и вуаля — у тебя есть статичное, но дешевое освещение. Двигать такие «запеченные» источники света в игре, само собой, нельзя — они намертво впечатаны в геометрию. Хочешь подвинуть — добро пожаловать на новый многочасовой круг ада под названием «перезапекание света». Технологии, которые мы заслужили.