Костыли и пиксели #10
Наверное, многие помнят легендарный стелс-экшен Splinter Cell. Главное правило выживания для спецагента Сэма Фишера звучало просто: выстрелил по лампочкам, зашел в густую тень, датчик света на интерфейсе потемнел — и вот враги уже в упор вас не видят. Но как игра понимает, что вы находитесь именно в тени?
Мы, как обычные геймеры, скажем: "Ну, движок просто проводит невидимые лучи от лампочки до персонажа, и если на пути есть стена, значит свет на героя не падает".
Звучит логично. Но на дворе был 2002 год. Освещение в Splinter Cell было революционным: там был динамический свет, лучи мягко пробивались сквозь жалюзи, а лампочки раскачивались от выстрелов. Заставить слабый процессор первого Xbox каждую секунду математически высчитывать, падают ли лучи от всех этих сложных источников на каждую косточку трехмерного Сэма Фишера, было физически невозможно. Приставка бы просто сгорела.
И тогда программисты Ubisoft применили визуальный хак, который вошел в историю видеоигр. Они почти полностью отказались от математики.
Вместо того чтобы высчитывать траекторию света, разработчики добавили крошечную, невидимую виртуальную камеру и повесили ее прямо над главным героем. Несколько десятков раз в секунду эта невидимая камера делает крошечный скриншот вашего героя. Дальше всё максимально примитивно. Игра берет этот скриншот (он скрыт в оперативной памяти и не выводится на экран) и просто усредняет цвета его пикселей.
- Если пиксели на фото в основном черные или темно-серые, код передает сигнал искусственному интеллекту врагов: "Всё ок, он в тени, игнорируйте его".
- Но стоит вам высунуться под уличный фонарь, пиксели на невидимом скриншоте становятся белыми. Игра моментально бьет тревогу: "Он светится, открывайте огонь!".
Самое смешное, что эта камера не могла видеть Фишера со всех сторон — это перегрузило бы приставку. Камера была одна. Из-за этого алгоритм иногда сбоил: если у Сэма под ярким фонарем торчал только ботинок, на крошечном скриншоте он занимал слишком мало пикселей. Система усредняла картинку, решала, что 95% героя всё еще во тьме, и охранники в упор не замечали торчащую на свету ногу!