3D світло та тіні

Вступ

Джерела світла випромінюють світло, яке змішується з матеріалами і дає видимий результат. Світло в сцені може виходити з декількох типів джерел:

  • Від самого Матеріалу у вигляді емісійного кольору (хоча він не впливає на довколишні предмети, якщо не запікається).

  • Вузли світла: Directional (Спрямоване), Omni (Навсібіч) та Spot (Обмежене).

  • Навколишнє світло в навколишньому середовищі.

  • Запечене світло (прочитайте Запечені карти освітлення).

Колір випромінювання є властивістю матеріалу. Детальніше ви можете прочитати в уроці Spatial Material.

Вузли світла

Існує три типи світлових вузлів: Directional light, Omni light та Spot light. Давайте розглянемо загальні параметри світла:

../../_images/light_params.png

Кожен з них має:

  • Color: Основний колір випромінюваного світла.

  • Energy: Множник енергії. Корисний для посилення світла, або роботи з Освітлення з високим динамічним діапазоном.

  • Indirect Energy: Другий множник, використовується при непрямому освітленні (для світла, що відбивається). Працює, як запечене світло, або GIProbe.

  • Negative: Світло, замість додаватися, віднімається. Іноді корисно вручну регулювати освітлення темних кутів.

  • Specular: Впливає на інтенсивність дзеркальної плями на об'єктах освітлених цим світлом. При нулі це світло стає чистим розсіяним світлом.

  • Bake Mode: Встановлює режим запікання світла. Для отримання додаткових відомостей дивіться Запечені карти освітлення

  • Cull Mask: Об'єкти, які знаходяться у вибраних шарах нижче, будуть освітлені цим світлом. Зауважте, що об'єкти, відключені за допомогою цієї маски, все одно кидають тіні. Якщо ви хочете, щоб вимкнені об'єкти не відкидали тіні, відрегулюйте властивість cast_shadow GeometryInstance до потрібного значення.

Відображення тіней

Світло може при потребі відкидати тіні. Це дає йому більшого реалізму (світло не досягає прихованих областей), але збільшує навантаження на продуктивність. Існує список загальних параметрів тіні для кожного світла:

  • Enabled: позначте галочкою, щоб увімкнути відображення тіней від цього світла.

  • Color: приховані області множаться на цей колір. Він чорний за замовчуванням, але його можна змінити на відтінки тіней.

  • Bias: Коли цей параметр занадто малий, відбувається само-затінювання. Коли занадто великий, тіні відокремлюються від свого джерела. Налаштуйтеся на те, що найкраще підходить для вас.

  • Contact: Виконує короткий рейкаст (кидання променів) в межах екранного простору, щоб зменшити розрив, породжений зміщенням. Ці тіні доступні лише під час використання сервера GLES3.

  • Reverse Cull Face: Some scenes work better when shadow mapping is rendered with face-culling inverted.

Нижче зображено роботу параметра зміщення Bias. Для більшості випадків підходять значення за замовчуванням, але в загальному все залежить від розміру і складності геометрії.

../../_images/shadow_bias.png

Нарешті, якщо прогалин не вдається уникнути, можна скористатися параметром Contact (за рахунок продуктивності):

../../_images/shadow_contact.png

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

Порада

Якщо зміщення тіні є проблемою на вашій сцені, почніть з таких параметрів:

  • Enable Reverse Cull Face. This reduces shadow peter-panning significantly and prevents lights from exhibiting shadow acne at grazing angles. The main downside is that it may cause lighting to leak in some corners. The other downside is that materials that have their cull mode set to Disabled or MeshInstances with Cast Shadow set to Double-Sided may exhibit shadow acne.

  • Встановіть зміщення Bias на -0.01. Зміщення має бути негативним, якщо Reverse Cull Face увімкнено, але позитивним, коли його вимкнено.

  • Для спрямованого світила DirectionalLight, встановіть напрям тіні Normal Bias на 0.0 і Bias Split Scale на 0.0. Залежно від вашої сцени, ви також можете ще більше зменшити зміщення Bias до значення між -0.05 і -0.1.

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

Спрямоване світло

Найпоширеніший тип світла, являє собою дуже далеке джерело світла (наприклад, Сонце). Це також найлегше світло для обчислення і його слід використовувати всюди де можливо (хоча у нього не найлегше для обчислення відображення тіней, але про це пізніше).

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

../../_images/light_directional.png

Кожна грань, лицьова сторона якої попадає під світлові промені, освітлюється, а інші залишаються темними. Більшість типів світла мають специфічні параметри, але спрямоване світло досить просте за своєю природою.

Відображення тіней для спрямованого світла

Для обчислення тіней сцена вимальовується (тільки глибина) з ортогональної точки зору, яка охоплює всю сцену (або до максимальної відстані). Існує, однак, проблема з таким підходом, тому що об'єкти ближче до камери отримують цегляні тіні.

../../_images/shadow_blocky.png

Для виправлення використовується техніка під назвою "Паралельне відображення розділених тіней" (або PSSM). Вона розділяє вид на 2, або 4, області. Кожна область має свою тінь. І це дозволяє невеликим ділянкам, близьким до глядача, мати таку ж роздільну здатність тіні, як і величезна, далека область.

../../_images/pssm_explained.png

В результаті тіні стають більш детальними і гладкими:

../../_images/shadow_pssm.png

Техніка PSSM керується рядом параметрів:

../../_images/directional_shadow_params.png

Кожна відстань поділу split контролюється відносно віддаленості камери (або тіньовим Max Distance, якщо більше нуля), тому 0,0 - положення очей, а 1,0 - там, де тінь закінчується на відстані. Поділи знаходяться між цими значеннями. Значення за замовчуванням, як правило, працюють добре, але налаштування першого поділу є трохи загальним, щоб дати більш детальну інформацію про закриття об'єктів (наприклад, персонаж у грі від третьої особи).

Завжди перевіряйте, чи встановили тінь Max Distance відповідно до того, що потрібно сцені. Менша максимальна відстань призведе до більш красивих тіней.

Іноді перехід між поділами може виглядати погано. Щоб виправити це, можна ввімкнути опцію "Blend Splits", яка жертвує деталями в обмін на більш плавні переходи:

../../_images/blend_splits.png

Параметр "Normal Bias" може бути використаний для фіксації особливих випадків самозатінювання, коли об'єкти перпендикулярні світлу. Єдиним недоліком є те, що він робить тінь трохи тоншою.

../../_images/normal_bias.png

Параметр "Bias Split Scale" може контролювати додаткове зміщення для поділів, які знаходяться далеко. Якщо самозатінювання відбувається тільки на віддалених поділах, це значення може їх виправити.

Нарешті "Depth Range" має два налаштування:

  • Stable: Зберігає тінь стабільною під час руху камери, і дефекти, які з'являються в контурі по краях тіні, залишаються на місці. Це значення за замовчуванням і взагалі бажане, але зменшує ефективну роздільну здатність тіні.

  • Optimized: Намагається отримати максимальну роздільну здатність, доступну в будь-який момент часу. Може призвести до ефекту "рухомої пили" на краях тіні, але в той же час тінь виглядає більш детальною (тому цей ефект може бути досить незначним, щоб звертати на нього увагу).

Активно експериментуйте з параметрами, щоб отримати найкращі результати для своєї сцени.

Розмір відображення тіней можна змінити в Параметри проекту -> Rendering -> Quality:

../../_images/project_setting_shadow.png

Його збільшення може вирішити проблеми зміщення, але знизити продуктивність. Відображення тіней - це ціле мистецтво.

Світло навсібіч

Світло навсібіч це точка, яка випромінює світло сферично на всі сторони в межах вказаного радіуса.

../../_images/light_omni.png

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

Для вирішення цього вводиться Range (Діапазон) з функцією згасання.

../../_images/light_omni_params.png

Ці два параметри дозволяють налаштувати візуальну роботу світла і знайти естетично приємні результати.

../../_images/light_attenuation.png

Відображення тіней світла навсібіч

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

Тіні навсібіч можуть бути вималювані, як "Подвійний параболоїд", або "Кубічна карта". Перший вимальовується швидко, але може викликати деформації, в той час як другий більш правильний, але важчий.

../../_images/shadow_omni_dp_cm.png

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

Обмежене світло

Обмежене світло схоже на світло навсібіч, тільки випромінює світло в конус (або «відріз»). Воно корисне для імітації ліхтариків, автомобільних ліхтарів, відбивачів, прожекторів і всього іншого, що освітлює одну точку, через що даний тип світла ще називають точковим. Цей тип світла також послаблюється в протилежному напрямку, на який він вказує.

../../_images/light_spot.png

Як і OmniLight (Світло навсібіч) обмежене світло теж має параметри Range та Attenuation, а на додаток до них ще два:

  • Angle (Кут): кут діафрагми світла

  • Angle Attenuation (Кут згасання): кут загасання, який допомагає пом'якшити краї конуса.

Відображення тіней від обмеженого світла

Даному типу світла не потрібні параметри для відображення тіней. Майте на увазі, що при діафрагмі більш ніж 89 градусів тіні перестають функціонувати, тому замість обмеженого вам слід розглянути можливість використання світла навсібіч.

Атлас тіней

На відміну від спрямованого світла, яке має власну текстуру тіні, у світла навсібіч та обмеженого світла тіні присвоюються полям атласу тіней. Цей атлас можна налаштувати в Параметри проекту -> Rendering -> Quality -> Shadow Atlas.

../../_images/shadow_atlas.png

Розширення поширюється на увесь Shadow Atlas (Атлас тіней). Атлас поділений на чотири квадранти:

../../_images/shadow_quadrants.png

Кожен квадрант може бути розділений на частини будь-якої кількості карт відображення тіней; нижче наведено поділ за замовчуванням:

../../_images/shadow_quadrants2.png

Логіка поділу проста. Найбільший розмір тіньової карти (коли не використовується поділ) являє собою світло розміром з екран (або більше). Підрозділи (менші карти) представляють тіні від світла, яке знаходиться далі від зору, і пропорційно менші.

Кожен кадр, наступна процедура виконується для кожного світла:

  1. Перевіряється, чи є світло на полі правильного розміру. Якщо ні, світло перемальовується наново і переміщується на більше/менше поле.

  2. Перевіряється, чи змінився будь-який об'єкт, що впливає на відображення тіні. Якщо так, то знову перемальовується світло.

  3. Якщо нічого з перерахованого не сталося, нічого не робиться, і тінь залишається без змін.

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

Ця стратегія поділу працює для більшості ігор, але в деяких випадках ви можете використовувати окрему (наприклад, гра зверху вниз, де все світло приблизно однакового розміру, а квадранти можуть мати однаковий поділ).

Якість фільтра тіней

Якість фільтра тіней можна налаштувати в Параметри проекту -> Rendering -> Quality -> Shadows. Godot не підтримує фільтр, PCF5 та PCF13.

../../_images/shadow_pcf1.png

Впливає на плавність контуру тіні:

../../_images/shadow_pcf2.png