Потребител:Mihail Balabanov/Ray tracing (graphics): Разлика между версии

Изтрито е съдържание Добавено е съдържание
Създадено чрез превод на страницата „Ray tracing (graphics)
 
This was a partial translation draft, the translation is now published in the main Wiki so this backup is unnecessary.
Етикети: Заместване Визуален редактор с уикитекст
 
Ред 1:
{{db-u1}}
 
[[Файл:Recursive_raytrace_of_a_sphere.png|дясно|мини|250x250пкс| Рекурсивно проследяване на лъчите за сфера, демонстриращо ефекти като малка [[дълбочина на рязкост]], площни светлинни източници и [[Отражение|дифузно отражение]]. ]]
В [[Компютърна графика|компютърната графика]] '''проследяването на лъчи''' е техника за [[Рендъринг|рендиране]], при която за да се генерира [[Цифрово изображение|изображение]], се проследява пътят на [[Светлина|светлината]] през [[Пиксел|пикселите]] от [[Равнина на изображението|равнината на изображението]] и се симулират последствията от взаимодействията ѝ с виртуални обекти. С тази техника може да се постигне много висока степен на визуален реализъм, обикновено по-висока от тази на типичните методи със [[сканираща линия]], но с [[Теория на изчислителната сложност|по-високи изчислителни разходи]]. Затова проследяването на лъчи е най-подходящо за приложения, в които относително бавното рендиране на всеки кадър е приемливо – например за неподвижни изображения и за [[визуални ефекти]] в киното и телевизията, – и по-неподходящо за приложения в реално време като [[Видеоигра|видео игрите]], където скоростта е от решаващо значение. Проследяването на лъчите е в състояние да симулира голямо разнообразие от оптични ефекти, като [[отражение]] и [[пречупване]], [[Разсейване на светлината|разсейване]] и [[Дисперсия (оптика)|дисперсионни]] явления (например [[хроматична аберация]]).
 
== Общо описание на алгоритъма ==
[[Файл:Ray_trace_diagram.svg|дясно|мини|300x300пкс| Алгоритъмът изгражда изображението, като изпраща лъчи към сцената. ]]
[[Файл:Ray_Tracing_Illustration_First_Bounce.png|дясно|мини|337x337пкс| Лъч през конкретен пиксел, проследен до първото отражение. ]]
Оптичното проследяване на лъчи е метод за получаване на изображения в [[3D компютърна графика|триизмерната компютърна графика]], който осигурява по-висок фотореализъм от техники като ''[[ray casting]]'' или [[сканираща линия]]. То работи чрез проследяване пътя на светлината от въображаемо око през всеки [[пиксел]] от виртуален екран и изчисляване на цвета на обекта, който се вижда през него.
 
Проследяването на лъчи изисква математическо описание на сцената, което се подготвя от програмист или художник (обикновено чрез специализиран софтуер). Сцените могат да включват и данни от изображения и модели, заснети с помощта на цифрова фотография и подобни средства.
 
Обикновено всеки лъч се проверява за пресичане с някакво подмножество от обектите в сцената. След като бъде открит най-близкият обект, алгоритъмът оценява падащата [[Осветление в тримерното моделиране|светлина]] в точката на пресичане, взема предвид свойствата на материала на обекта и въз основа на тази информация изчислява окончателния цвят на пиксела. Някои алгоритми за осветяване и отразяващи или полупрозрачни материали изискват проследяване на допълнителни лъчи в сцената.
 
На пръв поглед може да изглежда нелогично да се изпращат лъчи „назад“, т.е. ''навън'' от камерата, а не ''към'' нея (както се движи светлината в действителност), но това е с много порядъци по-ефективно. Тъй като огромното мнозинство от светлинните лъчи от даден източник не достигат пряко до очите на наблюдателя, симулацията в посока „напред“ може да доведе до огромно количество излишни изчисления за лъчи, които никога няма да бъдат регистрирани от окото.
 
Затова, за да се спестят изчисления, при проследяването на лъчи поначало се предполага, че даденият лъч пресича видимия кадър. След като лъчът претърпи максимален брой отражения или измине определено разстояние без пресичане, проследяването му приключва и се актуализира стойността на пиксела. {{Clear}}
 
== Подробно описание на компютърния алгоритъм за проследяване на лъчи и неговия произход ==
 
=== Какво се случва в природата (опростено) ===
В природата даден светлинен източник изпуска лъч светлина, който рано или късно стига до повърхност, която прекъсва движението му. Можем да си представяме този „лъч“ като поток от [[Фотон|фотони]], които се движат по един и същ път. В съвършен вакуум лъчът ще бъде права линия (ако пренебрегнем [[Обща теория на относителността|релативистичните ефекти]]). С него може да се случи произволна комбинация от следните четири явления: [[Поглъщане на светлината|поглъщане]], [[отражение]], [[пречупване]] и [[флуоресценция]]. Повърхността може да абсорбира част от светлинния лъч, намалявайки интензивността на отразената и/или пречупената светлина. Тя може също така да отрази целия лъч или част от него в една или повече посоки. Ако повърхността е [[Прозрачност (оптика)|прозрачна]] или [[Прозрачност (оптика)|полупрозрачна]], тя пречупва през себе си част от светлинния лъч в различна посока, като същевременно поглъща в част от [[Видим спектър|спектъра]] или целия спектър (и евентуално променя цвета). По-рядко, повърхността може да погълне част от светлината и да я излъчи отново чрез флуоресценция, с по-голяма дължина на вълната и в произволна посока, макар че това е достатъчно рядко, че да може да се пренебрегне в повечето приложения за визуализация. Сумата от погълнатата, отразената, пречупената и излъчената чрез флуоресценция светлина трябва да отговаря на цялата първоначална падаща светлина и не повече. Една повърхност не може, например, да отразява 66% от входящия светлинен лъч и да пречупва 50%, тъй като сумата от двете би била 116%. Впоследствие, отразените и/или пречупените лъчи могат да срещнат други повърхности, чиито абсорбционни, рефракционни, отразяващи и флуоресцентни свойства отново повлияват върху движението им. Някои от тези лъчи се движат по такъв начин, че стигат до очите ни, позволявайки ни да видим сцената, като по този начин допринасят за окончателното изображение.
 
=== Алгоритъм с хвърляне на лъчи (''ray casting'') ===
Първият алгоритъм за проследяване на лъчите, използван за рендиране, е представен от [[Артър Апел]] (''Arthur Appel'') през 1968 г.<ref><div> Appel A. (1968) ''[http://graphics.stanford.edu/courses/Appel.pdf Някои техники за нанасяне на твърди тела на машините за засенчване]'' . Конференция на AFIPS 32 стр.37-45 </div></ref> Впоследствие този алгоритъм получава името ''ray casting'' („хвърляне на лъчи“). Основната му идея е да се изпрати по един лъч от окото към всеки пиксел и да се намери най-близкият обект на пътя на лъча. Нека си представим, че гледаме изображението през фина мрежа, като всяко квадратче от нея е пиксел. Тогава намереният обект е точно този, който окото вижда през този пиксел. Вземайки предвид свойствата на материала и влиянието на светлинните източници в сцената, алгоритъмът може да определи [[Светлосянка|светлосянката]] в съответната точка от обекта. За простота се предполага, че ако повърхността е обърната към светлинен източник, светлината ще я достигне и няма да бъде закрита или засенчена. Светлосянката се изчислява чрез традиционните модели за осветяване в триизмерната компютърна графика. Важно предимство на хвърлянето на лъчи в сравнение с по-старите алгоритми със [[сканираща линия]] е фактът, че се справя лесно с не-равнинни повърхнини и тела като [[Конус|конуси]] и [[Сфера|сфери]]. Ако една математическа повърхнина може да бъде пресечена с лъч, тя може да се рендира чрез хвърляне на лъчи. Лесно могат да се рендират и по-сложни обекти, като бъдат пресъздадени с помощта на техники за [[параметрично моделиране]].
 
=== Алгоритъм за рекурсивно проследяване на лъчи ===
[[Файл:Glasses_800_edit.png|дясно|мини|300x300пкс| С проследяването на лъчи могат да се създават реалистични изображения. ]]
[[Файл:BallsRender.png|дясно|мини|300x300пкс| Освен високата степен на реализъм, проследяването на лъчи може да симулира особеностите на фотографските снимки, които се дължат на [[Дълбочина на рязкост|дълбочината на рязкост]] и формата на [[Бленда|блендата]] на фотоапарата (в този случай [[шестоъгълник]]). ]]
[[Файл:Ray-traced_steel_balls.jpg|дясно|мини|300x300пкс| Броят на разрешените отражения за всеки „лъч“ и начинът, по който му влияят срещнатите повърхностисе повлиява, когато срещне повърхност, се контролират чрез софтуерни настройки. Тук за всеки лъч е било разрешено да отрази до 16 пъти. Така могат да се видят множество „отражения на отраженията“. ''Създадено с [[Cobalt (CAD програма)|Cobalt]]'' ]]
[[Файл:Glass_ochem.png|дясно|мини|300x300пкс| Броят на разрешените [[Пречупване|пречупвания]] за всеки „лъч“ и начинът, по който му влияят срещнатите повърхности, се контролират чрез софтуерни настройки. Тук за всеки лъч е било разрешено да се пречупва и отразява до 9 пъти. Използвани са [[Отражение на Френел|отражения на Френел]]. Също така обърнете внимание на [[Каустика|каустиката]]. ''Създадено с [[V-Ray|Vray]]'' ]]
Следващият важен изследователски пробив идва от [[Търнър Уитид]] (''Turner Whitted'') през 1979 г.<ref><div> Whitted T. (1979) ''[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.156.1534 An improved illumination model for shaded display]'' . Proceedings of the 6th annual conference on Computer graphics and interactive techniques </div></ref> Предишните алгоритми проследяват лъчите от окото към сцената, докато те не срещнат обект, но определят цвета на лъча, без да проследяват рекурсивно повече лъчи. Уитид продължава процеса. Когато един лъч срещне повърхност, той може да генерира до три нови типа лъчи, за моделиране съответно на отражение, пречупване и сянка.<ref>{{Cite journal|url=https://dip.felk.cvut.cz/browse/pdfcache/nikodtom_2010bach.pdf|title=Ray Tracing Algorithm For Interactive Applications|author=Tomas Nikodym|journal=Czech Technical University, FEE|date=June 2010}}</ref> Лъчът за отражение се проследява в огледално отразена посока. Най-близкият обект, който пресече, е това, което ще се види в отражението. Лъчите за пречупване, които преминават през прозрачен материал, работят по подобен начин, но се добавя пречупен лъч, който може да влиза или излиза от материала. Към всеки светлинен източник се проследява лъч за засенчване. Ако между повърхността и източника има непрозрачен обект, повърхността е в сянка и източникът не я осветява. Това рекурсивно проследяване на лъчите подобрява реалистичността на изображенията.
 
Популярността на проследяването на лъчи се дължи на факта, че то се базира на реалистична симулация на [[Осветление в тримерното моделиране|осветление]], за разлика от други методи на рендиране (като сканираща линия и ''ray casting''). Ефекти като отражения и [[Сянка|сенки]], които са трудни за симулиране с други алгоритми, се получават естествено при алгоритъма с проследяване на лъчи. Изчислителната независимост на всеки лъч прави проследяването на лъчи податливо на [[Паралелни изчисления|паралелизация]]. <ref><div> Г-н J.-C. Небел. Нов паралелен алгоритъм, осигурен от изчислителен модел на времето, работилница по еврографска информация за паралелната графика и визуализация, 24-25 септември 1998 г., Рен, Франция. </div></ref> <ref>A. Chalmers, T. Davis, and E. Reinhard. Practical parallel rendering, {{ISBN|1-56881-179-9}}. AK Peters, Ltd., 2002.</ref>
 
=== Недостатъци ===
Сериозен недостатък на проследяването на лъчи е производителността (макар че на теория може да бъде по-бързо от традиционната сканираща линия в зависимост от сложността на сцената спрямо броя на пикселите на екрана). Алгоритмите със сканираща линия и други алгоритми използват кохерентността на данните, за да споделят изчисленията между пикселите, докато проследяването на лъчите обикновено започва процеса наново за всеки пиксел, третирайки поотделно всеки лъч от окото. Това разделяне обаче предлага други предимства, например възможността за изпращане на повече лъчи при необходимост, например за пространствено изглаждане на назъбванията и подобряване на качеството на изображението, когато е необходимо.
 
Въпреки че моделира точно взаимни отражения и оптични ефекти като пречупване, традиционното проследяване на лъчи не е задължително фотореалистично. Истински фотореализъм се получава, когато е налице [[Уравнение на рендирането|уравнението на рендирането]] е много добре апроксимирано или реализирано напълно. Пълната реализация на уравнението на рендирането дава истински фотореализъм, тъй като уравнението описва всички физични явления, свързани със светлинния поток. Това обаче обикновено е невъзможно, като се имат предвид необходимите компютърни ресурси.
 
Реализмът на всеки метод за рендиране може да бъде оценен като приближение към уравнението. Проследяването на лъчите, ако е ограничено до алгоритъма на Уитид, не е непременно най-реалистичното. Методите, които проследяват лъчите, но включват и допълнителни техники ( фотонно картиране , проследяване на пътя ), дават далеч по-точна симулация на реалното осветление.
[[Файл:Glass_ochem.png|дясно|мини|300x300пкс| Броят на [[Пречупване|пречупванията, които]] „лъчът“ може да предприеме и как се повлиява всеки път, когато срещне повърхност, се контролират чрез софтуерни настройки по време на проследяване на лъча. Тук на всеки лъч беше позволено да се пречупва и отразява до 9 пъти. Използвани са отражения на Френел . Също така обърнете внимание на каустиката . ''Създаден с [[V-Ray|Vray]]'' ]]
 
=== Предимства пред други методи за рендиране ===
 
: <mrow class="MJX-TeXAtom-ORD"><mstyle displaystyle="true" scriptlevel="0"><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><msup><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi></mrow><mrow class="MJX-TeXAtom-ORD"><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn></mrow></msup><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><msup><mi> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi><mrow class="MJX-TeXAtom-ORD"><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn></mrow></msup><mo> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi></mrow><mo> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi></mrow><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mi> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi><mo> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><msup><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi></mrow><mrow class="MJX-TeXAtom-ORD"><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn></mrow></msup><mo> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><msup><mi> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mi><mrow class="MJX-TeXAtom-ORD"><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn></mrow></msup><mo stretchy="false"> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mo> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mo><mn> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </mn></mstyle></mrow> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math><math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> <math>(\mathbf{d}^2)t^2+(2\mathbf{v}\cdot\mathbf{d})t+(\mathbf{v}^2-r^2)=0.</math> </img> <span></span>
 
== Източници ==
<references group="" responsive="0"></references>
<nowiki>
[[Категория:3D компютърна графика]]
[[Категория:Компютърна графика]]
[[Категория:Виртуална реалност]]
[[Категория:Геометрична оптика]]
[[Категория:Pages with unreviewed translations]]</nowiki>