Поводьтеся з багатьма світлами на сцені (за допомогою шейдерів)


9

Мені цікаво, як поводитися з багатьма вогнями в сцені. З огляду на дуже велику карту в рольовій грі, з підземеллями (з вогнями там) тощо. Я знаю про відкладене освітлення, але це відповідає лише на те, як відтворити багато вогнів. Але моє запитання більше: як не виводити багато вогнів. Очевидно, бажано відображати лише світло, що впливає на сцену, але я не знаю техніки / алгоритму для архівування цього. Ніхто не хоче або навіть не може видати 500 точкових вогнів, тільки тому, що там десь на карті. Але не можна просто взяти пряму лінію від світла до гравця і перевірити, чи щось середнє. Відстань також не здається хорошим показником. (Сонячне світло?)

tl; dr: Як я можу зрозуміти, які вогні впливають на сцену, щоб лише відобразити їх?


OpenGL або DirectX?
kravemir

6
насправді 500 вогнів були б цілком можливі при відкладеному освітленні, якщо ви не хочете тіней для всіх;)

Наприклад, для точкових і конусних вкладишів можна використовувати оклюзійне відсікання - точкове світло - це просто сфера. Спрямоване світло видно звідусіль
Кікаймару

4
@Darkwings Ви в основному описуєте тут те, про що попросили баламути. Як я ходжу? Ну, я думаю, що рішення тут - просто ходити! (Працював для мене.) ;-) "Ви повинні знати, чи це джерело висвітлює щось, на ваш погляд, фрустум". <- Це саме те , що він просить, він хоче знати, як він може це зробити. ^^ Хоча, мабуть, корисна річ із конусом / сферою від Кікаймару.
cooky451

1
Для ОП не було очевидно перевірити фрустум виду, оскільки він згадав просто відстань. Кожне світло буде мати деякі параметри, щоб визначити це. Якщо використовуються спрямовані вогники, вони діставатимуться скрізь, точкові світильники матимуть цільову зону (щоб це можна було вирішити за допомогою перетину вектор-площина) тощо. Вам слід більше подумати над лініями, якими вогнями ви хочете впливати на сцену, враховуючи, що якщо у вас дійсно багато вогнів, дійсно близьких один до одного, вам буде краще наблизитись (для лиття тіней). IE: 100 свічок на антикварній люстрі можна обробляти як одне світло.
Darkwings

Відповіді:


5

Навіть простіше, ніж обмежуючі обсяги;

Призначте радіус кожному світлу. Що стосується візуалізації вашої сцени, просто перевірте, чи відстань між вашими предметами сцени та кожним світлом менше радіуса світла. Якщо так, використовуйте світло, інакше пропустіть його.

Просто частка складніша, залежно від того, наскільки важлива продуктивність:

Ви можете зробити якусь широку фазову перевірку і з цим. Просто визначте просторову сітку, яка зберігає ручки для ваших вогнів на основі комірки сітки, а потім лише проведіть перевірку відстані на вогнях, що знаходяться в клітинках в межах максимального радіусу об’єктів сцени.


5
+1 - підозріло звучить як обмежувальна сфера;)
Gyan aka Gary Buyn

Трохи пізно ... все одно, що "точно обмежуюча сфера. Використовуючи цей метод, ви все одно візуалізуєте світильники, які повністю затьмарені стінами тощо, і, таким чином, не мають значення для сцени. Також не кожне світло йде в усі боки.
Darkwings

5

Найпростіший спосіб, який я можу придумати (давайте, чесно кажучи, єдиний спосіб, про який я думав) - надати кожному світлу обмежувальну гучність . Якщо обмежуючий об'єм перетинається з фрустумом подання (або обмежуючим об'ємом фрустуму виду), застосуйте світло.

Ще можуть бути світлі, які застосовуються, хоча вони не впливають на видимі об’єкти, але це просто і швидко. Розумне розташування графіку сцени може означати, що лише кілька перевірок перехрестя пригальмують більшість ваших вогнів (як і те, що робиться для відсікання об'єкта).

Щось схоже на сонце не може мати обмежувального обсягу (для позначення його слід застосовувати завжди).

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