Трасування шляху

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

Трасування шляху — це метод Монте-Карло для рендеринга зображень тривимірних сцен у комп'ютерній графіці, глобальне освітлення котрих точно відповідає дійсності. По суті, алгоритм інтегрується по всій освітленості, що надходить в одну точку на поверхні об'єкту. Потім цю освітленість зменшують за допомогою функції відображення поверхні (двопроменева функція відбивної здатності), щоб визначити, яка частина буде передана до точки огляду камери. Ця процедура інтеграції повторюється для кожного пікселя в вихідному зображенні. У поєднанні з фізично точними моделями поверхонь, точними моделями реальних джерел світла (лампочками) і оптично-правильними камерами, трасування шляху може створювати нерухомі зображення, які не відрізняються від фотографій.

Трасування шляху природним чином імітує багато ефектів, які повинні бути спеціально додані до інших методів (звичайне трасування променів або алгоритм «Scanline»), такі як м'які тіні, глибина різко зображуваного простору, розмитість зображення, каустика, ambient occlusion і непряме освітлення. Відповідно простіше реалізувати рендеринг, що включає ці ефекти. Розширений варіант алгоритму реалізується шляхом об'ємного трасування шляху, який враховує розсіювання світла сцени.

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

Історія[ред. | ред. код]

Рівняння рендерингу і його використання в комп'ютерній графіці було представлене Джеймсом Каджая[en] в 1986[1]. Трасування шляху був введений тоді як алгоритм для знаходження чисельного рішення інтеграла рівняння рендерингу. Десять років по тому, Lafortune запропонували багато уточнень, в тому числі алгоритм двобічного трасування шляху.[2]

Metropolis light transport, метод збурень раніше знайдених шляхів для збільшення продуктивності в складних сценах, був представлений в 1997 році Еріком Вічем (англ. Eric Veach) і Леонідасом Гуібасом (англ. Leonidas J. Guibas)

Зовсім нещодавно процесори і графічні процесори стали досить потужними, щоб рендерити зображення швидше, що викликало більш широкий інтерес до алгоритмів трасування шляху. Тім Перселл вперше представив глобальний алгоритм освітлення, що працює на графічному процесорі в 2002 році.[3] У лютому 2009 року Остін Робінсон з Nvidia продемонстрував першу комерційну реалізацію трасування шляху, яка працює на GPU.[4] Цьому сприяло дозрівання GPGPU-орієнтованих інструментів програмування, таких як CUDA і OpenCL, а також SDK GPU для трасування променів, таких як OptiX[en].

У 2015 році планується перенесення трасування шляху на DirectX 12 і Vulkan (API). Роботи над першим вже ведуться.

Трасування шляху зіграла важливу роль в кіноіндустрії. Раніше фільми використовували засоби алгоритму «Scanline» для створення CG-візуальних ефектів і анімації. У 1998 році Blue Sky Studios представили короткометражний фільм Банні, який отримав премію Оскар, з їх власними засобами рендеринга трасування шляхів CGI Studio, з м'якими тінями і ефектами непрямого освітлення. У 2006 році в Sony Pictures Imageworks[en] був зроблений перший анімаційний повнометражний художній фільм Будинок-монстр, який був повністю створений на трасувальникові шляхів, використовуючи комерційний рендер Arnold[en]. До 2014 року практично всі візуальні ефекти і анімаційні фільми почали використовувати трасування шляху.

Опис[ред. | ред. код]

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

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

I. Для даної внутрішньої сцени кожен об'єкт в кімнаті повинен сприяти висвітленню кожного іншого об'єкта.

II. По-друге, не існує відмінності між освітленням, випромінюваних джерелом світла, і освітленням, відбитим від поверхні.

Придуманий в 1984 році, зовсім інший метод, званий radiosity, був вірний обом принципам. Однак radiosity пов'язує загальну освітленість, що потрапляє на поверхню, з рівномірною яскравістю, яка залишає поверхню. Це змусило всі поверхні бути Ламбертіанськими, або «абсолютно розмитими». Усвідомлення того, що розсіювання від поверхні залежить як від вхідних, так і від вихідних напрямів, є ключовим принципом функції розподілу двонаправленого відображення. Ця залежність напрямку була центром дослідження, результатом якого стали публікації важливих ідей протягом 1990-х років.

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

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

Алгоритм[ред. | ред. код]

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

  Color TracePath(Ray r, depth) {
    if (depth == MaxDepth) {
      return Black;  // Bounced enough times.
    }

    r.FindNearestObject();
    if (r.hitSomething == false) {
      return Black;  // Nothing was hit.
    }

    Material m = r.thingHit->material;
    Color emittance = m.emittance;

    // Pick a random direction from here and keep going.
    Ray newRay;
    newRay.origin = r.pointWhereObjWasHit;
    newRay.direction = RandomUnitVectorInHemisphereOf(r.normalWhereObjWasHit);  // This is NOT a cosine-weighted distribution!

    // Compute the BRDF for this ray (assuming Lambertian reflection)
    float cos_theta = DotProduct(newRay.direction, r.normalWhereObjWasHit);
    Color BRDF = 2 * m.reflectance * cos_theta;
    Color reflected = TracePath(newRay, depth + 1);

    // Apply the Rendering Equation here.
    return emittance + (BRDF * reflected);
  }

Примітка: BRDF — Bidirectional reflectance distribution function — Двопроменева функція відбивної здатності

Двонаправлене трасування шляху[ред. | ред. код]

Вибірка інтеграла для точки може бути виконана за допомогою будь-якого з наступних двох різних підходів:

  • Стріляти променями (Shooting rays) з джерел світла і створювати шляхи в сцені. Шлях переривається випадковим числом кроків-відскоків променя. Потім світло прямує на проектований піксель результуючого зображення. Під час цього методу рендерингу мільйони шляхів створюються і на зображенні запам'ятовуються результати прорахунку шляхів, що вносять вклад.
  • Збирати промені (Gathering rays) з точки на поверхні. Промінь вистрілюється крізь пікселі зображення і скаче по сцені, поки не зустріне на своєму шляху джерело світла. Світло з джерела світла тоді надсилається у напрямку пікселів зображення. Процес створення шляху називається «семплінгом». Одна точка поверхні зазвичай отримує від 800 семплів (до 3 тисяч). Фінальна картинка переводиться за допомогою арифметичних дій, не простим підсумовуванням семплів.

Двонаправлене трасування променів комбінує Shooting та Gathering в одному алгоритмі і це дає більш швидку збіжність зображенню (швидше і менше шуму). Ці 2 методи генерації шляхів трасуються незалежно і потім початок вистріленого шляху (shooting path) з'єднується з хвостом шляху збору променів (gathering path). Враховується загасання світла при кожному відскоку променя і запам'ятовується в пікселях зображення. Ця техніка здається на перший погляд парадоксально повільною, але це через те, що рахуються відразу 2 шляхи. На практиці ж — навпаки, додаткова швидкість збіжності зображення компенсує уповільнення, що виникають через необхідність випускати нові і нові промені. Для прискорення конвергенції (збіжність, зближення) зображень, двонаправлені алгоритми трасують шляхи в обох напрямках. У прямому напрямку промені трасуються від джерела світла до тих пір, поки вони не стануть настільки слабкими, що їх не можна буде побачити, чи поки не потраплять на об'єктив віртуальної камери. У зворотному, тобто стандартному загальноприйнятому напрямку, промені трасуються від віртуальної камери до тих пір, поки вони не зіткнуться з джерелом світла, або поки кількість їх відображень не перевищить певну межу. Такий підхід зазвичай приводить до такого зображення, яке сходиться набагато швидше, ніж при використанні лише одного напрямку.

Продуктивність[ред. | ред. код]

Шум зменшується в міру збільшення кількості вибірок на піксель. У лівому верхньому куті відображається 1 вибірка на піксель, та подвоєна вибірка в кожному квадраті зліва направо.

Трасувальник шляху постійно проводить вибірку пікселів зображення. Зображення стає впізнаванним тільки тоді, коли проведено кілька вибірок на один піксель, аж до 100 вибірок на піксель. Як правило, для звичайних зображень і для зменшення цифрового шуму до прийнятного рівня роблять близько 5000 вибірок. Однак для патологічних випадків кількість вибірок стає набагато більше.

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

Група методів Metropolis light transport[en] злегка змінюють раніше відтрасовані успішні шляхи і робить більш важливі для зображення вибірки першими. Це може привести до зниження шумності зображення і зниження кількості вибірок.

Функції розподілу розсіювання[ред. | ред. код]

Зображення функцій розподілу двонаправленого розсіювання

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

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1.   Kajiya, J. T. (1986). The rendering equation. Proceedings of the 13th annual conference on Computer graphics and interactive techniques. ACM.
  2.   Lafortune, E, Mathematical Models and Monte Carlo Algorithms for Physically Based Rendering [Архівовано 24 квітня 2010 у Wayback Machine.], (PhD thesis), 1996.
  3.   Purcell, T J; Buck, I; Mark, W; and Hanrahan, P, «Ray Tracing on Programmable Graphics Hardware», Proc. SIGGRAPH 2002, 703—712. See also Purcell, T, Ray tracing on a stream processor [Архівовано 10 жовтня 2017 у Wayback Machine.] (PhD thesis), 2004.
  4.   Robison, Austin, «Interactive Ray Tracing on the GPU and NVIRT Overview» [Архівовано 30 серпня 2017 у Wayback Machine.], slide 37, I3D 2009.
  5.   Veach, E., and Guibas, L. J. Metropolis light transport [Архівовано 16 травня 2017 у Wayback Machine.]. In SIGGRAPH'97 (August 1997), pp. 65–76.
  6. SmallPt [Архівовано 16 травня 2017 у Wayback Machine.] is an educational path tracer by Kevin Beason. It uses 99 lines of C++ (including scene description). This page has a good set of examples of noise resulting from this technique.