3D світло та тіні¶
Вступ¶
Джерела світла випромінюють світло, яке змішується з матеріалами і дає видимий результат. Світло в сцені може виходити з декількох типів джерел:
Від самого Матеріалу у вигляді емісійного кольору (хоча він не впливає на довколишні предмети, якщо не запікається).
Вузли світла: Directional (Спрямоване), Omni (Навсібіч) та Spot (Обмежене).
Навколишнє світло в навколишньому середовищі.
Запечене світло (прочитайте Запечені карти освітлення).
Колір випромінювання є властивістю матеріалу. Детальніше ви можете прочитати в уроці Spatial Material.
Вузли світла¶
Існує три типи світлових вузлів: Directional light, Omni light та Spot light. Давайте розглянемо загальні параметри світла:

Кожен з них має:
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. Для більшості випадків підходять значення за замовчуванням, але в загальному все залежить від розміру і складності геометрії.

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

Будь-які проблеми зі зміщенням завжди можуть бути виправлені шляхом збільшення роздільної здатності карти тіней, хоча це може призвести до зниження продуктивності.
Порада
Якщо зміщення тіні є проблемою на вашій сцені, почніть з таких параметрів:
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-моделювання.
Спрямоване світло¶
Найпоширеніший тип світла, являє собою дуже далеке джерело світла (наприклад, Сонце). Це також найлегше світло для обчислення і його слід використовувати всюди де можливо (хоча у нього не найлегше для обчислення відображення тіней, але про це пізніше).
Спрямоване світло моделює нескінченну кількість паралельних світлових променів, що охоплюють всю сцену. Спрямований світловий вузол представлений великою стрілкою, яка вказує напрямок світлових променів. При цьому положення вузла зовсім не впливає на освітлення і він може бути де завгодно.

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

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

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

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

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

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

Параметр "Bias Split Scale" може контролювати додаткове зміщення для поділів, які знаходяться далеко. Якщо самозатінювання відбувається тільки на віддалених поділах, це значення може їх виправити.
Нарешті "Depth Range" має два налаштування:
Stable: Зберігає тінь стабільною під час руху камери, і дефекти, які з'являються в контурі по краях тіні, залишаються на місці. Це значення за замовчуванням і взагалі бажане, але зменшує ефективну роздільну здатність тіні.
Optimized: Намагається отримати максимальну роздільну здатність, доступну в будь-який момент часу. Може призвести до ефекту "рухомої пили" на краях тіні, але в той же час тінь виглядає детальнішою (тому цей ефект може бути досить незначним, щоб запримітити його).
Активно експериментуйте з параметрами, щоб отримати найкращі результати для своєї сцени.
Розмір відображення тіней можна змінити в Параметри проекту -> Rendering -> Quality:

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

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

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

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

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

Як і OmniLight (Світло навсібіч) обмежене світло також має параметри Range та Attenuation, а на додаток до них ще два:
Angle (Кут): кут діафрагми світла
Angle Attenuation (Кут згасання): кут загасання, який допомагає пом'якшити краї конуса.
Відображення тіней від обмеженого світла¶
Даному типу світла не потрібні параметри для відображення тіней. Майте на увазі, що при діафрагмі більш ніж 89 градусів тіні перестають функціонувати, тому замість обмеженого вам слід розглянути можливість використання світла навсібіч.
Атлас тіней¶
На відміну від спрямованого світла, яке має власну текстуру тіні, у світла навсібіч та обмеженого світла тіні присвоюються полям атласу тіней. Цей атлас можна налаштувати в Параметри проекту -> Rendering -> Quality -> Shadow Atlas.

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

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

Логіка поділу проста. Найбільший розмір тіньової карти (коли не використовується поділ) являє собою світло розміром з екран (або більше). Підрозділи (менші карти) представляють тіні від світла, яке знаходиться далі від зору, і пропорційно менші.
Кожен кадр, наступна процедура виконується для кожного світла:
Перевіряється, чи є світло на полі правильного розміру. Якщо ні, світло перемальовується наново і переміщується на більше/менше поле.
Перевіряється, чи змінився будь-який об'єкт, що впливає на відображення тіні. Якщо так, то знову перемальовується світло.
Якщо нічого з перерахованого не сталося, нічого не робиться, і тінь залишається без змін.
Якщо поля в квадранті заповнені, світла відсуваються назад до менших полів, в залежності від розміру і відстані.
Ця стратегія поділу працює для більшості ігор, але в деяких випадках ви можете використовувати окрему (наприклад, гра зверху вниз, де все світло приблизно однакового розміру, а квадранти можуть мати однаковий поділ).
Якість фільтра тіней¶
Якість фільтра тіней можна налаштувати в Параметри проекту -> Rendering -> Quality -> Shadows. Godot не підтримує фільтр, PCF5 та PCF13.

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