Переклад проекту на Unity 5. Шейдери і світло

Переклад проекту на Unity 5. Шейдери і світло

Передісторія

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

В силу своєї роботи технічних художником майстром на всі руки, мені довелося кинути все і терміново зробити UP проекту на Unity 5. Не так давно Apple зобов'язала розробників створювати 64-бітні додатки.

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

Старий Beast пішов в історію і світло доведеться перепікати.

Нижче вся зібрана інформація з питання: переклад мануала і туторіала з оф.сайту Unity3D, і деякі нотатки (за налаштуваннями) від мене.

Присвячується всім, хто перейшов на Unity 5.

Стандартний шейдер

Корисні посилання:

Чому ваші старі і самописні шейдери не працюють;

Офіційний туторіал по шейдерах.

Опис

Новий стандартний Unity Shader для кожної платформи збирається окремо, тобто невикористовувані поля не йдуть у підсумковий шейдер. Оптимізація шейдера проводиться за цільовою платформою, коли стандартний шейдер білдиться, відбувається 2 важливі речі:

  • Всі властивості, які не використані, вирізаються з подальшого білда (а може вони використовують пресети);
  • Зібраний шейдер перевіряється і оптимізується під тип пристрою (див. Build Settings), тому не потрібно піклуватися про продуктивність;

Параметри стандартного шейдера розділені на три розділи:

Rendering mode - режим візуалізації (прозорий, напівпрозорий, просто текстура або колір).

  • Opaque - непрозорий, відрисовка буде проводитися без альфа; Colour is tint the texture.
  • CutOut - це Alpha testing, параметр Alpha Cutoff визначає межу між двома станами: «повністю прозорий» і «непрозорий».
  • Fade - по суті те ж, що і Transparent, але дозволяє зробити об'єкт абсолютно прозорим.
  • Transparent - напівпрозорий, наприклад використовується для скла, alpha in Albedo використовується для регулювання прозорості.

Main Maps - група властивостей, що описує головну текстуру та її властивості.

  • Albedo - основна текстура і/або колір, альфа (RGB + A) впливає на відблиск і прозорість, в різних rendering mode.
  • Metallic (при Standart) - визначає ступінь, з яким матеріал відображає оточення, при нолі виглядає як матовий пластик, а при 1 - як дзеркальний або металевий матеріал. Використовуючи білий колір або текстуру, отримаємо матеріал, схожий на метал. Оптимально використовувати відтінки сірого. Канал R у текстурі відповідає за властивість Metallness, у каналі A (альфе) - Smoothness.
  • Specular (при Specular Setup) - визначає колір відображення і його яскравість з альфи.
  • NormalMap - чарівна текстура для об'ємності: бере вектор (x, y, z) з пікселя (r, g, b) і вносить додаткову деталізацію при освітленні (та інших ефектах, SSR, наприклад). Виходить ефект об'ємності.
  • HeceMap - друга чарівна текстура, вона ж карта висот, схожа на NormalMap, вона потрібна для Displacement-mapping (з тесселяцією) або для Parallax Occlusion'a.
  • Occlusion - властивість, яка працює з текстурою (ч/б), і затінює «грані» на текстурі, мається на увазі Ambeint-Occlussion. Наприклад, затемнення швів цегляної стіни.
  • Emission - випромінювання, колір відсвіту об'єкта.
  • Detail Mask - може використовуватися для накладання маски на Secondary Maps.

Для властивості Albedo, Metallic і Emission текстура є параметром і НЕ обов'язкова.

Для властивості Albedo і Emission можна вказати колір, але для Emission колір не можна задати при scale рівними нулю.

Secondary Maps - група властивостей, що описує другу текстуру, що накладається на головну.

Приклад використання показано на тканині з візерунком, де Main Maps має колір і текстуру, а Secondary Maps накладає візерунок, типу вишивки, і його текстуру.

Освітлення

Я знайшла деяку документацію щодо GI, але якихось робочих налаштувань там не було. Тому я переклала те, що мені вдалося знайти і спробувала різні налаштування запікання. Всі налаштування отримані експериментальним шляхом і читанням мануалів з офф. сайту, блогу і форуму.

Для мене було корисно завантажити проект села вікінгів.

На даний момент я працюю над повноцінним 3D проектом, але для планшетів. У мене статичні тіні, лайтпроби і джерело світла. Тип світла Directional, а параметри запікання Mixed.

Перший сюрприз: у вас на в LocalSettings сидить 10Гб кеш. Подивитися на це неподобство можна в меню Edit - > Preferece...

Самостійно він не видаляється, треба чистити руками.

Про перший бейк:

У мене система на SSD 256Гб, тому я перенесла кеш на звичайний хард. Чесно кажучи, різниці в швидкості бейка я не помітила, а там генерується досить багато текстур. Перший бейк сцени на 100к поліків, при повністю дефолтних налаштуваннях, згенерил 200 карт (light + dir) загальною вагою 1Гб (процес йшов на i7-4770, оперативи 32 гіга і 24/7 годин). Природно все це коту під хвіст.

Опис нових можливостей

Зараз Unity використовує технологію Enlighten глобального освітлення в реальному часі (GI).

Використовує динамічний GI для прямого освітлення і тіней. Вони розраховуються в реальному часі використовуючи GPU (графічний процесор) пристрою.

Real-time GI необхідно попередньо розрахувати. При цьому ви не отримаєте Lightmap, як це було в Beast, швидше за все вийде LightmapSnapshot. Ця штука багато важить оскільки містить зліпок ваших Lightmap. У білд цей LightmapSnapshot потрапить вже в іншому розмірі. Що там відбувається я не знаю.

Опис панелей Lighting

Як приклад я використовую проект з селом вікінгів, далі Window - > Lighting, вкладка Scene.

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

Запікання відбувається в 2 етапи, в першому 11 стадій, у другому 15. Для Baked GI клініт на 5/11 Clastering, 7/11 LceTransport, 4/15 Bake AO, 6/15 Bake Visibility і 12/15 BakeInderect.

Scene Tab. Environment Lighting

Світло має бути Baked або Mixed, що дозволить плавно перемикатися між запеченими і вираховуваними в реальному часі режимах GI.

Властивості Skybox і Sun не є обов'язковими і можуть залишатися порожніми.

SkyBox - властивість для імітації неба або фону задника.

Sun - при використанні SkyBox, тут можна вказати напрямки світла або «сонця» (або якесь велике, віддалене джерело світла, що висвітлює сцену). Якщо цей параметр не використовується (None), DirectionalLight стане нескінченно віддаленим джерелом світла, like sun.

Ambient Source - джерело розсіяного світла Ambient Light, яке освітлює все в сцені (правильне визначення дещо складніше). Він може бути 3 типів:

  • SkyBox - в полі Skybox потрібно вказати матеріал з Cubemap (приблизно такий). Skybox використовує кольори Skybox для визначення навколишнього світла, що виходить під різними кутами.
  • Gradient - дозволяє призначити кольори для Sky Color, Equator Color і Ground Color, виглядає приблизно так. Ця властивість послідовно плавно змішує перелічені кольори.
  • Color - колір навколишнього світла.

Ambient Intensity - яскравість Ambient Light, регулюється від 0 до 1.

Ambient GI - властивість доступна, коли ввімкнено режим Precomputed Realtime GI і Baked GI. Дозволяє вибрати спосіб (Precomputed Realtime або запечений/Baked GI), який буде використано для розсіяного світла.

Reflection Source - джерело відбитків. Дозволяє вказати, чи слід використовувати Skybox для ефектів відображення (за замовчуванням) або ж вибрати Cubemap. Якщо Skybox вибрано як джерело, додатковий параметр потрібен для того, щоб встановити роздільну здатність для розрахунку відображень.

Reflection Intensity - ступінь впливу Cubemap або Skybox відбитків на сцену.

Reflection Bounces - скільки разів відбиття об'єкта позначиться. Доречно згадати дзеркальний коридор.

Precomputed Realtime GI

Realtime Resolution - встановлює кількість текселів, які будуть використовуватися на одиницю довжини для об'єктів, освітлених у реальному часі GI. Зазвичай це значення приблизно в десять разів нижче, ніж роздільна здатність запечених. Може бути нецілим, наприклад 0,5.

CPU Usage - визначає наскільки можна вантажити CPU в редакторі при запіканні текстур в реальному часі.

Baked GI

Baked Resolution - встановлює кількість текселів (наприклад, «texture pixels»), які будуть використовуватися на одиницю довжини для об'єктів, освітлених BakedGI. Для швидкого протопіпування краще використовувати значення в діапазоні 1-4.

Baked Padding - відстань на текстурі між запеченими об'єктами в текселях.

Compressed - чи буде стискатися текстура. Займе менше місця, але можливі артефакти.

Ambient Occlusion - відносна яскравість поверхонь в Ambient occlusion тобто затемнення на внутрішніх кутах. Вищі значення показали більш високу контрастність між затіненими і освітленими місцями. Це застосовується тільки до Indirect (непрямого) освітлення, розрахованого системою GI.

Final Gather - коли параметр увімкнено, остаточне світло, отримане в розрахунку GI, матиме ту саму роздільну здатність, що й запечені карти освітлення.

General GI

Наступні параметри впливають на відображене світло в режимах Realtime і Baked GI mode: розсіяне Ambient, відображене світло Light Bounces і випромінювання Emissive матеріалів, але не відображення.

Indirect intensity - масштабує інтенсивність Indirect light. У меню Scene Window - > Irradiance можна переглянути Indirect light.

Bounce Boost - наскільки сильно світло відбивається від однієї поверхні до іншої. Відображене світло множиться на це значення, стандартно дорівнює 1.

Directional Mode - по суті вказує чи потрібно зберігати інформацію Directional і Specular в лайтмапи при Baked GI mode.

Atlas size - розмір лайтмап при запіканні Baked GI mode. Зазвичай ставлю 1024px.

У Skined Mesh Renderer тепер додалася нова властивість - Lightmap Parameters, ця властивість відповідає за угруповання об'єктів, наприклад всередині приміщення і зовні, за рівнями або сценами, так як задасте ви або автоматично.

Мої низькі налаштування для швидкого бейка.

Precomputed Realtime GI

  • Resolution - роздільна здатність кінцевої лайтмапи в тікселях до світових одиниць.
  • Cluster Resolution - Відношення дозволу кластера до роздільної здатності кінцевої лайтмапи, тобто роздільна здатність, до якої розраховується відбите світло.
  • Irradiance Budget - значення визначає точність, з якою дані про падаюче (прибуткове) світло використовуються для розрахунку світла кожного текселя на лайтмапі, тобто записується шаблон (патерн) падаючого світла. Більш низькі значення призводять до розмиття контурів освітленої частини, більш високе значення до більш чітких контур. Захоплюватися цим параметром не можна, оскільки він безпосередньо вантажить оперативу і порожній при бейку.
  • Irradiance Quality - якість передачі відбитого світла на лайтмапі. Значення не впливає на кінцевий результат на пристрої, але збільшує precomputing time in the editor. Як я розумію, ця властивість еквівалентна властивості Final Gather Rays в Beast, але для відображених променів. Більше променів - вища якість, але більше і час бейку.
  • Backface Tolerance - це властивість дозволяє знехтувати освітленням тих тикселів, які недостатньо освітлені (наприклад, знаходяться всередині міша), а розрахунок їх освітленості проводиться інтерполяцією з текселями, що поруч знаходяться. Допомагає уникнути артефактів.
  • Modelling Tolerance - максимальний розмір отворів в геометрії сітки, яким можна знехтувати при розрахунку GI.
  • Edge Stitching - якщо опція включена, то UV «charts» будуть запечені з лайтмапами, щоб уникнути візуальних артефактів.
  • Is Transparent - якщо параметр увімкнено, об'єкти з прозорістю залишаються прозорими під час розрахунку GI. При цьому бекфейси не враховуються і світло проходить крізь об'єкт. Можна використовувати для випромінювальних невидимих поверхонь
  • System Tag - група об'єктів з лайтмапами в одному атласі. Це також деталізація, від якої залежать обчислення. Декілька систем створюються автоматично, якщо у сцені достатньо об'єктів. Різні System Tag можна використовувати для різних рівнів у локації або частин рівня.

Baked GI

  • Blur Radius - радіус у тикселях з фільтра розмиття, який застосовується для прямого освітлення під час постобробки. Цей радіус відповідає відстані, на якій будуть усереднюватися сусідні тикселі. Вищі рівні знижують ймовірність появи артефактів і роблять краї тіні більш гладкими або м'якими.
  • Antialiasing Samples - ступінь згладжування для придушення артефактів.
  • Direct Light Quality - число променів використовується для оцінки прямого освітлення (повний аналог Final Gather Rays в Beast). Більша кількість променів дає більш точні м'які тіні.

Baked AO

  • Quality - кількість променів для розрахунку ambient occlusion (AO)
  • Antialiasing Samples - ступінь згладжування, для придушення артефактів.
  • Baked Tag - як і описане вище System Tag, дозволяє групувати об'єкти в певні набори для запікання. Можна використовувати для оптимізації динамічного завантаження рівня.

Для Baked Tag і System Tag числове значення не є істотним, об'єкти використовують один і той же лайтмап, якщо вони мають однакове значення тага.

General GI. Directional Lightmapping

Directional lightmaps зберігає більше інформації про освітлення середовища, ніж звичайні карти освітлення. Шейдери можуть використовувати цю особливість для отримання додаткових даних про поступаюче світло, щоб краще розрахувати відображене світло. Це відбувається за рахунок використання текстури більшого обсягу пам'яті і shading time.

Можна вибрати один із 3-х режимів: Non-directional, Directional и Directional with Specular. Всі три підтримують realtime і запечені лайтмапи.

Non-directional: flat diffuse.

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

Directional: normal-mapped diffuse

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

Directional with Specular: full shading

Як і в попередньому, тут використовується 2 додаткові латмапи: світло і напрямок, але тут вони розділені навпіл. Ліва сторона зберігає пряме світло, права - непряме. Відмінність полягає в тому, що світло зберігається у вигляді incoming intensity (освітленість). Ця інформація дозволяє використовувати шейдери, схожі на BRDF-шейдери, які зазвичай зарезервовані для освітлення в realtime. У результаті можна отримати матеріал з впливом непрямого світла.

Подвійні карти освітлення (Dual lightmaps) - дозволяють використовувати віддзеркалювальні поверхні (specular), карти нормалів (normal mapping).

Directional використовує вдвічі більше пам'яті порівняно з Non-directional і має вищу shading cost.

Directional with Specular використовує вдвічі більше пам'яті порівняно з Directional.

Сподіваюся на конструктивні зауваження, можливо, я в чомусь не права. Буду вдячна за поради.

logo