Світло у воксельному світі: справжні джерела чи flood fill?
Гравець ставить світильник у своїй базі. Що відбувається технічно? Це невинне запитання спричинило для нас принципове рішення — а відповідь є гарним прикладом того, що «сучасніше» рішення не завжди краще.
Варіант А: справжнє світло Unity. Кожен сяючий блок стає точковим джерелом світла, усе обчислює рушій. Виглядає чудово — але не масштабується. У воксельному світі в полі зору можуть бути сотні сяючих блоків; точкові світла в реальному часі в такій кількості змушують попітніти будь-який GPU, тим паче в браузерній збірці.
Варіант Б: світло flood fill. Класика жанру: світло — це числове значення на блок, що поширюється від джерела й зменшується з кожним кроком. Дешевіше нікуди, джерел можна скільки завгодно — але результат виглядає пласким, бо світло не має напрямку. Стіна біля лампи така ж яскрава, як поверхня під нею.
Наш вибір: flood fill з напрямком. Ми залишилися при підході flood fill, але навчили його інформації про напрямок: світло знає, звідки воно йде, і поверхні освітлюються відповідно по-різному. Результат запікається в меш чанка під час мешингу — під час роботи це майже нічого не коштує, але виглядає помітно об'ємніше за класичне блокове світло.
Цей урок ми відтоді несемо скрізь: спершу запитайте, у чому справжня проблема жанру (тут: дуже багато джерел, статична геометрія), і лише потім обирайте технологію. Справжні світла розв'язували проблему, якої в нас не було, — і створили б таку, яку ми не розв'яжемо.
Коментарі