Трасування променів

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

Трасування променів (англ. ray tracing ) у комп'ютерній графіці є способом створення зображення тривимірних об'єктів чи сцени за допомогою відстеження ходу променя світла крізь точку екрану і симуляції взаємодії цього променя з уявними об'єктами, що підлягають відображенню. Цей спосіб дозволяє створювати надзвичайно реалістичні зображення, зазвичай значно вищої якості, ніж дає типовий алгоритм Scanline або ж метод кидання променів (англ. Ray casting), проте має значно вищу обчислювальну складність. Із цієї причини алгоритми трасування променів використовуються там, де немає суттєвих обмежень часу рендерингу, наприклад у створенні нерухомих зображень чи для комп'ютерної графіки і спецефектів у фільмах, мультиплікації чи телебаченні, але є в наш час (2012 рік) малопридатними для застосувань, що працюють в режимі реального часу, наприклад, відеоігор. Метод трасування променів здатний симулювати широкий набір оптичних ефектів, таких як відбиття променів, їх заломлення, розсіювання чи хроматичну аберацію.

Опис алгоритму[ред.ред. код]

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

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

Фізичні основи алгоритму[ред.ред. код]

Завдяки правильній обробці затінення та заломлення світла реалістичність сцен, обрахованих методом трасування променів, інколи сягає "фотографічної"

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

Метод кидання променів (англ. ray casting)[ред.ред. код]

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

Деталізований опис алгоритму[ред.ред. код]

Через кожен піксель з віртуального "ока" глядача проводиться промінь. Кожен промінь трасується. Спрощений алгоритм трасування є таким:

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

Якщо ж перетин знайшовся, то:

а) поточну яскравість вважаємо фоновою

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

в) якщо перетин знайдено, і він розташований між поверхнею і джерелом світла, то джерело світла не освітлює цю поверхню.

г) якщо джерело світла освітлює поверхню, то вираховуємо за рівнянням Фонга чи іншим освітленість точки поверхні, і додаємо її до поточної.

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

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

Переваги[ред.ред. код]

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

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

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

Недоліки[ред.ред. код]

Трасування променів не дозволяє отримати такий ефект, як каустика світла

Головним недоліком на теперішній час (2012 рік) є надмірна часова складність алгоритму, яка перевищує можливості сучасних настільних і портативних комп'ютерів.

Ще однією вадою є те, що хоча алгоритм точно враховує різні оптичні ефекти, традиційний метод трасування променів дає не завжди фотореалістичні зображення. Справжній фотореалізм можливий лише коли рівняння рендеринга апроксимується доволі близько, адже це рівняння враховує кожен можливий ефект потоку світла. Однак це потребує часом надзвичайно великих обчислювальних потужностей. Тож будь-який метод рендерингу є лише наближенням до цього рівняння, і часом метод трасування променів не є найбільш близьким, а отже — і реалістичним. Інші методи, зокрема метод відображення (чи розподілу) фотонів (photon mapping), частково використовують алгоритм трасування променів, але дають значно реалістичніші результати, дозволяючи відображати такі складні ефекти, як, для прикладу, каустики.

Застосування алгоритму[ред.ред. код]

Трасування променів в кіно[ред.ред. код]

Трасування променів в кіноіндустрії застосовується вже дуже давно і стала фактично стандартним методом візуалізації в цій галузі. Зрозуміло для завдань кіно необхідний фотореалістичний рендеринг. Швидкість в принципі не так важлива. Буває, що окремі послідовності кадрів розраховуються тижнями, і на обробку кадру йде більше 1 години (при 24 кадр/сек виходить, що 1 секунда буде рендерится 24 години).

Трасування променів в іграх[ред.ред. код]

У комп'ютерних іграх у трасування променів подвійне застосування. Розрахунок карт освітлення або лайтмапів. Зазвичай це робиться за допомогою фотонних карт. Практично будь–яка сучасна 3D гра використовує карти освітленості. Лайтмап – це текстура, на якій освітлення намальовано. Вона накладається поверх сцени і виходить, що сцена освітлена. Друге застосування трасування променів в іграх – безпосередня візуалізація, попіксельний розрахунок зображення кожен кадр. Прикладів таких ігор можна привести мало головним чином, тому що кількість пікселів досить велике і протрасувати мільйон променів 25 разів на секунду це досить непросте завдання. Вже зараз з'являються 8–ядерні машини в якості ПК, обчислювальних потужностей яких у принципі вистачає для візуалізації середньої сцени методом трасування променів.

Трасування променів у торговельному бізнесі[ред.ред. код]

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

Трасування променів зокрема в програмному забезпеченні[ред.ред. код]