Не знаю как в вашем случае, но я, проходя первый раз заключительную главу первой части Crysis, всё не переставал думать об острове под "погодным куполом" который был на заднем плане. Но как я узнал позднее — этот остров был частью неба. Сегодня мы поговорим с вами про skybox (с английского — небесная коробка) и cubemap (от английского — кубическая карта). Открывайте сметанку к пельмешкам, на связи разработчик игр с восьмилетним опытом работы.
Небо в реальной жизни
Выйдите на улицу. Посмотрите на небо. Неважно пасмурно ли у вас, усеяно ли небо звездами или покрыто белыми облаками — вы точно знаете как устроено ваше небо. Мы знаем что на разном расстоянии от нас находятся облака, а за ними звёзды и луна.
360° видео
Как можно запечатлеть это небо целиком на память? Самый сложный способ — посадить 5 художников его перерисовывать. Четверо рисуют запад, восток, север, юг, а один верх. Соединив их картины в куб, изображением в середину — мы увидим то же самое небо. Это и есть та самая кубическая карта из начала статьи. Вот только создавать её сегодня можно намного проще. Сейчас для создания таких карт используют камеры которые делают снимок (запись) одновременно и получают 360° фото/видео. На YouTube таких видео полно. Но как это всё применимо в играх?
Фейковые отражения в играх и Cubemap
До недавнего появления RTX большинство игр использовали фейковые отражения. Представьте что мы хотим сделать в своей игре хрустальную люстру с красивыми отражениями. Создаём точку на карте, где будет люстра. Ставим 6 камер повернутых в 6 сторон и делаем на них одновременно скриншот.
Мы получаем куб, который с виду покажется зеркальным. Теперь цепляем лампу и пишем простейший шейдер который будет помимо текстуры хрусталя давать текстуру в зависимости от положения игрока.
Например, если игрок стоит под люстрой и посмотрит на неё, он увидит в качестве текстуры скриншот из камеры смотревшей вниз.
Таким образом нам не пришлось использовать настоящие отражения, а воспользовались простейшей хитростью пришедшей к разработчикам с Directx 9 (но использовали её и раньше). Сейчас это делается в пару кликов, а такие 6 скриншотов соединенных в один называются Cubemap.
SkyBox
А теперь представьте, что у нас есть таких вот 5 фото красивого заката. Нам всего лишь нужно открыть фоторедактор, удалить с фото землю, добавить 6 нижнее фото созданное в фоторедакторе и отправить в игровой движок.
В игре мы применим дикую, но гениальную идею — мы прицепим на голову игроку коробку из начала статьи, где все картинки нарисованы внутри. Далее мы программно запретим коробке вращаться и заставим всегда повторять перемещения игрока. Что нам это даст? Теперь в нашей игре есть настоящее небо. Игрок видит это небо в 360° , вращая головой, ведь мы запретили программно этому небу делать какие-либо вращения, и вращая головой игрок видит это небо со всех сторон. Но больше он ничего не видит, ведь дальше коробки не посмотришь. Давайте это исправлять!
У каждой игры есть дальность прорисовки. А что, если мы увеличим размер этой коробки до размеров дальности прорисовки и отключим физику?Отлично! Теперь мы видим все объекты, а за ними небо. Осталось только добавить источник света в точку, в которой на нашем SkyBox сфотографировано (нарисовано) солнце и небо в игре готово.
Прелесть такого способа в том, что можно дорисовать на небо в фотошопе всё что угодно. Хотите две луны - пожалуйста! Хотите зеленые облака - вашу фантазию ничто не ограничивает! Именно так и сделали Crytek в игре Crysis. Вдалеке за морем мы всегда видели остров. Но глупо было бы постоянно отрисовывать локацию острова, если всё-равно в этой игре к нему лететь уже никто не собирался, чтоб играть там. Потому умельцы просто дорисовали его к скриншоту неба и ни у кого не осталось сомнений что там был остров.
Если у вас остались вопросы — пишите их в комментариях! Возможно именно ваш вопрос станет темой для следующей статьи