Як я можу реалізовувати освітлення та тіні у багатошаровій графіці 2D?


11

Я зараз пишу ізометричну гру з нуля, і я хотів би знати, як / якщо я можу додати світло та тіні.

Код, який я маю до сих пір, можна знайти тут , але його має бути достатньо, щоб знати, що зараз карти - це прості 3d масиви справжніх / хибних значень . Ось знімок середовища:Скріншот багатошарової карти плитки

Якби це одношарова плитка, це було б прямо вперед. Я можу зрозуміти просте радіомовлення в 2d, яке потрібно.

Однак, враховуючи, що мої карти мають різні рівні висоти, а також печерні райони, я не знаю, як робити переконливі тіні для цього. Можливо, рішення на один блок - єдиний реалістичний спосіб?


Шукаєте попередньо випечене або динамічно генероване освітлення? Чи "печерні райони" показані відрізаними, якщо гравець заходить, чи світло також має враховувати стелю? Чи очікуєте, що кожна плитка буде двійковою освітленою / темною, або мати якесь дробове значення?
Анко

1
@Anko Я б віддав перевагу щось дробове, як 0-1,1 (для надсвітлих областей, як вибухи тощо), але це може бути просто блокова основа, без реальної інтерполяції чи чогось подібного. Мені дуже хочеться, щоб це було динамічно і підтримувало декілька вогнів. І хоча "печерні" / покрівельні ділянки будуть показані відрізаними, альго потрібно буде враховувати, що блоки не відображаються при розрахунку світла. Наприклад, якщо ви ходите в будинку, блоки даху зникнуть, але все одно він повинен бути тінистим всередині.
Danie Clawson

Якщо ви шукаєте таке рішення з печерами та висотою, вам здається, що у вас немає нічого. Ви, напевно, шукаєте повне 3D-рішення, навіть якщо камера завжди дивиться в напрямку на північ-45 °. Ви повинні дивитися на техніку, як трафарет-тінь або подібне.
Адріан Мейр

По-друге, @AdrianMaire вам потрібно буде виконати правильні 3d обчислення, але зробити кілька ярликів, якщо немає інтерполяції по гранях "плитки". Якщо ви не робите інтерполяції, ви, ймовірно, можете використовувати промені.
NeomerArcana

Зараз у мене немає розумового простору, щоб перетворити його на відповідь, але я просто натрапив на цю публікацію в блозі про визначення прямолінійного зору для місцевості на карті висоти . Це звучить як те, що ви шукаєте.
Анко

Відповіді:


1

Чи можу я порекомендувати спочатку працювати 2d тіні, навіть якщо це лише для того рівня, на якому зараз знаходиться ваш аватар. Буде простіше почати дивитися на код таким чином і змусити його працювати.

Я реалізував тіні на картах 2d плитки двома способами. Один метод затінення тіней, який я знайшов, описаний Еріком Ліппертом у Microsoft, працює досить добре.

І інший спосіб, який я робив сам вперше, коли я дивився на цю річ, полягав у тому, щоб ортогонально підмітати видимі плитки та кахлі, а також створити краї (а може бути, кути iirc), описуючи сцену з найменшою кількістю країв. Тоді ви можете скинути приховані краї та сформувати будь-які спеціальні функції затінення, такі як заглиблені тіні, якщо ви хочете показати трохи стіни. Потім створіть свою геометрію тіні (проекційне тіньове лиття?) Та візьміть її зверху.

Але якщо я спробую взяти цю ідею до 3d, це просто стане простіше зробити це в 3d. Хоча метод, описаний Еріком Ліппертом, імовірно, може бути перетворений в 3d. Але я думаю, ви побачите, що робити це в 3d дорого. Можливо, подивіться також вихідний код для Brogue . Це може мати більш ефективну реалізацію для 2d видимості / лиття в тіні.

Удачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.