В компютърната графика проследяването на лъчи е техника за рендиране, при която за да се генерира изображение, се проследява пътят на светлината през пикселите от равнината на изображението и се симулират последствията от взаимодействията ѝ с виртуални обекти. С тази техника може да се постигне много висока степен на визуален реализъм, обикновено по-висока от тази на типичните методи със сканираща линия, но с по-високи изчислителни разходи. Затова проследяването на лъчи е най-подходящо за приложения, в които относително бавното рендиране на всеки кадър е приемливо – например за неподвижни изображения и за визуални ефекти в киното и телевизията, – и по-неподходящо за приложения в реално време като видео игрите, където скоростта е от решаващо значение. Проследяването на лъчите е в състояние да симулира голямо разнообразие от оптични ефекти, като отражение и пречупване, разсейване и дисперсионни явления (например хроматична аберация).

Общо описание на алгоритъма

Оптичното проследяване на лъчи е метод за получаване на изображения в триизмерната компютърна графика, който осигурява по-висок фотореализъм от техники като ray casting или сканираща линия. То работи чрез проследяване пътя на светлината от въображаемо око през всеки пиксел от виртуален екран и изчисляване на цвета на обекта, който се вижда през него.

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

Обикновено всеки лъч се проверява за пресичане с някакво подмножество от обектите в сцената. След като бъде открит най-близкият обект, алгоритъмът оценява падащата светлина в точката на пресичане, взема предвид свойствата на материала на обекта и въз основа на тази информация изчислява окончателния цвят на пиксела. Някои алгоритми за осветяване и отразяващи или полупрозрачни материали изискват проследяване на допълнителни лъчи в сцената.

На пръв поглед може да изглежда нелогично да се изпращат лъчи „назад“, т.е. навън от камерата, а не към нея (както се движи светлината в действителност), но това е с много порядъци по-ефективно. Тъй като огромното мнозинство от светлинните лъчи от даден източник не достигат пряко до очите на наблюдателя, симулацията в посока „напред“ може да доведе до огромно количество излишни изчисления за лъчи, които никога няма да бъдат регистрирани от окото.

Затова, за да се спестят изчисления, при проследяването на лъчи поначало се предполага, че даденият лъч пресича видимия кадър. След като лъчът претърпи максимален брой отражения или измине определено разстояние без пресичане, проследяването му приключва и се актуализира стойността на пиксела.

Изчисляване на лъчи за правоъгълен прозорец на изгледа На входа имаме (в изчислението използваме нормализация на вектори и векторно произведение):

позиция на окото позиция на целта зрително поле – за човек можем да приемем брой квадратни пиксели в прозореца на изгледа във вертикална и хоризонтална посока индекси на конкретен пиксел вертикален вектор, определящ посоките нагоре и надолу, обикновено (не е показан на илюстрацията)

Идеята е да се намери позицията на центъра на всеки пиксел от прозореца на изгледа, , което лесно ще ни позволи да намерим права от окото през този пиксел и съответно лъч, описан от точката и вектора (или нормализирания му вариант ). Първо трябва да намерим координатите на долния ляв пиксел на прозореца на изгледа, , а след това намираме следващия пиксел, транслирайки в посоки, успоредни на прозореца на изгледа (вектори и ) със стъпка размера на пиксела. Долните формули използват разстоянието между окото и прозореца на изгледа, но тази стойност се съкращава при нормализирането на лъча (поради това можем просто да приемем, че и да го премахнем от изчисленията).

Предварителни изчисления: намираме и нормализираме вектора и векторите , които са успоредни на изгледа (и трите са показани на горната илюстрация).

Отбелязваме, че центърът на изгледа е , после изчисляваме размерите му , разделени на 2, вземайки предвид пропорцията

и след това намираме векторите за отместване на следващия пиксел в посоки (), успоредни на прозореца на изгледа, и центъра на левия долен пиксел

Изчисления: отбелязваме, че и лъчът , следователно

Горната формула е изпробвана в този проект на JavaScript (работи в браузъра).

Подробно описание на компютърния алгоритъм за проследяване на лъчи и неговия произход Какво се случва в природата (опростено) В природата даден светлинен източник изпуска лъч светлина, който рано или късно стига до повърхност, която прекъсва движението му. Можем да си представяме този „лъч“ като поток от фотони, които се движат по един и същ път. В съвършен вакуум лъчът ще бъде права линия (ако пренебрегнем релативистичните ефекти). С него може да се случи произволна комбинация от следните четири явления: поглъщане, отражение, пречупване и флуоресценция. Повърхността може да абсорбира част от светлинния лъч, намалявайки интензивността на отразената и/или пречупената светлина. Тя може също така да отрази целия лъч или част от него в една или повече посоки. Ако повърхността е прозрачна или полупрозрачна, тя пречупва през себе си част от светлинния лъч в различна посока, като същевременно поглъща в част от спектъра или целия спектър (и евентуално променя цвета). Понякога повърхността може да погълне част от светлината и да я излъчи отново чрез флуоресценция, с по-голяма дължина на вълната и в произволна посока, макар че това е достатъчно рядко, че може да се пренебрегне в повечето приложения за рендиране. Сумата от погълнатата, отразената, пречупената и излъчената чрез флуоресценция светлина трябва да отговаря на цялата първоначална падаща светлина и не повече. Една повърхност не може, например, да отразява 66% от входящия светлинен лъч и да пречупва 50%, тъй като сумата от двете би била 116%. Впоследствие, отразените и/или пречупените лъчи могат да срещнат други повърхности, чиито абсорбционни, рефракционни, отразяващи и флуоресцентни свойства отново повлияват върху движението им. Някои от тези лъчи се движат по такъв начин, че стигат до очите ни, позволявайки ни да видим сцената, като по този начин допринасят за окончателното изображение.

Алгоритъм с хвърляне на лъчи (ray casting) Първият алгоритъм за проследяване на лъчите, използван за рендиране, е представен от Артър Апел през 1968 г.Appel A. (1968) Some techniques for shading machine renderings of solids. AFIPS Conference Proc. 32 pp.37 – 45 Впоследствие този алгоритъм получава името ray casting („хвърляне на лъчи“). Основната му идея е да се изпрати по един лъч от окото към всеки пиксел и да се намери най-близкият обект на пътя на лъча. Нека си представим, че гледаме изображението през фина мрежа, като всяко квадратче от нея е пиксел. Тогава намереният обект е точно този, който окото вижда през този пиксел. Вземайки предвид свойствата на материала и влиянието на светлинните източници в сцената, алгоритъмът може да определи светлосянката в съответната точка от обекта. За простота се предполага, че ако повърхността е обърната към светлинен източник, светлината ще я достигне и няма да бъде закрита или засенчена. Светлосянката се изчислява чрез традиционните модели за осветяване в триизмерната компютърна графика. Важно предимство на хвърлянето на лъчи в сравнение с по-старите алгоритми със сканираща линия е фактът, че се справя лесно с не-равнинни повърхнини и тела като конуси и сфери. Ако една математическа повърхнина може да бъде пресечена с лъч, тя може да се рендира чрез хвърляне на лъчи. Лесно могат да се рендират и по-сложни обекти, като бъдат пресъздадени с помощта на техники за параметрично моделиране.

Рекурсивен алгоритъм за проследяване на лъчи

Следващият важен изследователски пробив идва от Търнър Уитид през 1979 г.Whitted T. (1979) An improved illumination model for shaded display. Proceedings of the 6th annual conference on Computer graphics and interactive techniques Предишните алгоритми проследяват лъчи от окото към сцената, докато те не срещнат обект, но определят цвета на лъча, без да проследяват рекурсивно повече лъчи. Уитид продължава процеса. Когато един лъч срещне повърхност, той може да генерира до три нови типа лъчи, за моделиране съответно на отражение, пречупване и сянка. Лъчът за отражение се проследява в огледално отразена посока. Най-близкият обект, който пресече, е това, което ще се види в отражението. Лъчите за пречупване, които преминават през прозрачен материал, работят по подобен начин, но се добавя пречупен лъч, който може да влиза или излиза от материала. Към всеки светлинен източник се проследява лъч за засенчване. Ако между повърхността и източника има непрозрачен обект, повърхността е в сянка и източникът не я осветява. Това рекурсивно проследяване на лъчите подобрява реалистичността на изображенията.

Предимства пред други методи на рендериране Популярността на проследяването на лъчи се дължи на факта, че то се базира на реалистична симулация на осветление, за разлика от други методи на рендериране (като сканираща линия и ray casting). Ефекти като отражения и сенки, които са трудни за симулиране с други алгоритми, се получават естествено при алгоритъма с проследяване на лъчи. Изчислителната независимост на всеки лъч прави проследяването на лъчи податливо на паралелизация.J.-C. Nebel. A New Parallel Algorithm Provided by a Computation Time Model, Eurographics Workshop on Parallel Graphics and Visualisation, 24 – 25 септември 1998, Rennes, France.A. Chalmers, T. Davis, and E. Reinhard. Practical parallel rendering, . AK Peters, Ltd., 2002.

Недостатъци Сериозен недостатък на проследяването на лъчи е ниското бързодействие (макар че на теория може да бъде по-бързо от традиционната сканираща линия в зависимост от сложността на сцената спрямо броя на пикселите на екрана). Алгоритмите със сканираща линия и други алгоритми използват кохерентността на данните, за да споделят изчисленията между пикселите, докато проследяването на лъчи обикновено започва процеса наново, обработвайки всеки лъч от окото поотделно. Това разделяне обаче предлага други предимства, например възможността да се изпращат повече лъчи при нужда, за да се извърши пространствено изглаждане на назъбванията и да се подобри качеството на изображението, където е необходимо.

Въпреки че моделира точно взаимни отражения и оптични ефекти като пречупване, традиционното проследяване на лъчи не е задължително фотореалистично. Истински фотореализъм се получава, когато е налице уравнението на рендирането е много добре апроксимирано или реализирано напълно. Пълната реализация на уравнението на рендирането дава истински фотореализъм, тъй като уравнението описва всички физични явления, свързани със светлинния поток. Това обаче обикновено е невъзможно, като се имат предвид необходимите изчислителни ресурси.

Реализмът на всеки метод за рендиране може да бъде оценен като приближение към уравнението. Проследяването на лъчите, ако е ограничено до алгоритъма на Уитид, не е непременно най-реалистичното. Методите, които проследяват лъчи, но включват и допълнителни техники (фотонни карти, проследяване на пътища), дават далеч по-точна симулация на реалното осветление.

Обърната посока на обхождане на сцената от лъчите Създаването на изображение чрез изпращане на лъчи от окото към светлинния източник понякога се нарича обратно проследяване на лъчи, тъй като фотоните в действителност се движат в обратна посока. Тази терминология обаче е свързана с обърквания. Отначало проследяването на лъчи винаги се е извършвало от окото, а ранните изследователи като Джеймс Арво разбират под термина „обратно проследяване на лъчи“ изпращане на лъчи откъм светлинните източници и събиране на резултатите. Затова е по-ясно проследяването на лъчи да се дели на проследяване откъм окото или откъм светлинния източник.