Shadow mapping
Shadow mapping (відображення/проекція тіней) — це процес, за допомогою якого тіні додаються до тривимірної комп'ютерної графіки. Це поняття було введене Лансом Вільямсом у 1978 році в статті під назвою «Відкидання кривих тіней на криві поверхні». Відтоді вона використовується як у попередньо відрендерених так і в сценах реального часу в багатьох комп'ютерних іграх.
Тіні створюються шляхом перевірки того, чи видно піксель від джерела світла, шляхом порівняння пікселя з z-буфером або зображенням глибини з погляду джерела світла, яке зберігається у вигляді текстури.
Принцип тіні
Якщо ви подивитеся на джерело світла, то всі об'єкти, які ви бачите, будуть у світлі. Проте все, що знаходиться позаду цих об'єктів, буде в тіні. Це основний принцип, який використовується для створення карти тіней. Відображається вигляд світла, зберігаючи глибину кожної поверхні, яку він бачить (карта тіней). Потім візуалізується звичайна сцена, порівнюючи глибину кожної намальованої точки (так, ніби її бачить світло, а не око) з цією картою глибини.
Цей метод менш точний, ніж об'єми тіней, але карта тіней може бути швидшою альтернативою, залежно від того, скільки часу заповнення потрібно для кожного з методів у конкретній програмі, і тому може бути більш придатною для додатків, що працюють у реальному часі. Крім того, карти тіней не потребують використання додаткового буфера трафарету і можуть бути модифіковані для створення тіней з м'яким краєм. Однак, на відміну від об'ємів тіней, точність карти тіней обмежена її роздільною здатністю.
Огляд алгоритму
Відтворення затіненої сцени складається з двох основних етапів малювання. На першому створюється сама карта тіней, а на другому вона накладається на сцену. Залежно від реалізації (і кількості джерел світла), для цього може знадобитися два або більше проходів малювання.
Створення проєкції тіней
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/1light.png/150px-1light.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/2shadowmap.png/150px-2shadowmap.png)
На першому кроці зображуємо сцену з точки зору світла. Для точкового джерела світла вигляд має бути перспективною проекцією, ширина якої дорівнює бажаному куту ефекту (це буде щось на кшталт квадратного прожектора). Для спрямованого світла (наприклад, від Сонця) слід використовувати ортографічну проекцію.
З цього рендерингу витягується і зберігається буфер глибини. Оскільки важлива лише інформація про глибину, зазвичай не оновлюють колірні буфери і вимикають всі розрахунки освітлення і текстур для цього візуалізатора, щоб заощадити час малювання. Ця карта глибини часто зберігається як текстура у графічній пам'яті.
Цю карту глибини слід оновлювати щоразу, коли змінюються освітлення або об'єкти у сцені, але її можна використовувати повторно в інших ситуаціях, наприклад, коли рухається лише камера спостереження. (Якщо є декілька джерел світла, для кожного джерела слід використовувати окрему карту глибини).
У багатьох реалізаціях практично доцільно рендерити лише підмножину об'єктів у сцені на карту тіней, щоб заощадити час, необхідний для перемальовування карти. Крім того, зміщення глибини, яке зміщує об'єкти від світла, може бути застосоване до зображування карти тіней, щоб вирішити проблеми зшивання, коли значення карти глибини близьке до глибини поверхні, що малюється (тобто поверхні, що відкидає тінь) на наступному кроці. Крім того, для отримання подібного результату іноді використовують відсіювання передніх поверхонь об'єктів і додавання до карти тіней лише їхніх задніх сторін.
Затінення сцени
Другий крок — намалювати сцену зі звичайної точки зору камери, застосувавши карту тіней. Цей процес складається з трьох основних компонентів. Перший крок — знаходження координат об'єкта з точки зору світла, оскільки 3D-об'єкт використовує лише двовимірні координати з осями X та Y для представлення своєї геометричної форми на екрані, ці координати вершин збігатимуться з відповідними краями тіньових частин на самій карті тіней (карті глибини). Другим кроком є перевірка глибини, яка порівнює значення z об'єкта зі значеннями z з карти глибини, і, нарешті, після завершення перевірки, об'єкт має бути намальований або в тіні, або на світлі.
Координати світлового простору
![](http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/4overmap.png/150px-4overmap.png)
Щоб перевірити точку на карті глибини, її положення в координатах сцени має бути перетворено в еквівалентне положення, яке бачить світло. Це досягається за допомогою матричного множення. Розташування об'єкта на екрані визначається звичайним перетворенням координат, але для розташування об'єкта у світловому просторі необхідно згенерувати другий набір координат.
Матриця, що використовується для перетворення світових координат у координати огляду світла, є такою ж, як і та, що використовувалася для рендерингу карти тіней на першому кроці (в OpenGL це добуток матриці огляду моделі та матриці проекцій). Це призводить до створення набору однорідних координат, які потребують перспективного поділу (див. 3D-проекція), щоб стати нормалізованими координатами пристрою, в яких кожен компонент (x, y або z) знаходиться в діапазоні від -1 до 1 (якщо він видимий з точки зору світла). Багато реалізацій (наприклад, OpenGL та Direct3D) вимагають додаткового масштабування та множення матриці зсуву, щоб відобразити ці значення від -1 до 1 у значення від 0 до 1, які є більш звичними координатами для пошуку карти глибини (текстури). Це масштабування можна виконати перед поділом перспективи, і воно легко вкладається у попередній розрахунок перетворення шляхом множення цієї матриці на наступну:
Якщо це робиться за допомогою шейдера або іншого розширення графічного обладнання, це перетворення зазвичай застосовується на рівні вершини, а згенероване значення інтерполюється між іншими вершинами і передається на рівень фрагмента.
Тест карти глибин
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/5failed.png/150px-5failed.png)
Після того, як координати світлового простору знайдено, значення x та y зазвичай відповідають розташуванню на текстурі карти глибин, а значення z відповідає відповідній глибині, яку тепер можна перевірити на карті глибин.
Якщо значення z є більшим за значення, що зберігається на карті глибин у відповідному місці (x, y), об'єкт вважається таким, що знаходиться за об'єктом, який його затуляє, і має бути позначений як невдалий, щоб бути намальованим у тіні під час процесу малювання. В іншому випадку, він має бути намальований освітленим.
Якщо точка (x, y) знаходиться за межами карти глибини, програміст повинен вирішити, що поверхня має бути освітленою або затіненою за замовчуванням (зазвичай освітленою).
У шейдерній реалізації цей тест виконується на рівні фрагмента. Також слід бути обережним при виборі типу зберігання карти текстур, який буде використовуватися апаратним забезпеченням: якщо інтерполяція неможлива, тінь матиме різкий, нерівний край (ефект, який можна зменшити за допомогою більшої роздільної здатності карти тіней).
Тест карти глибини можна модифікувати так, щоб він створював тіні з м'яким краєм, використовуючи діапазон значень (на основі близькості до краю тіні), а не просто «пройшов» або «не пройшов».
Техніка картографування тіней також може бути модифікована для нанесення текстури на освітлені ділянки, імітуючи ефект проектора. Зображення вище з підписом «візуалізація карти глибини, спроектованої на сцену» є прикладом такого процесу.
Малюємо сцену
![](http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/7fin.png/150px-7fin.png)
Малювання сцени тінями можна виконати кількома різними способами. Якщо доступні програмовані шейдери, тест карти глибини можна виконати за допомогою фрагментного шейдера, який просто малює об'єкт у тіні або освітленим, залежно від результату, малюючи сцену за один прохід (після початкового попереднього проходу для створення карти тіней).
Якщо шейдери недоступні, виконання тесту карти глибини зазвичай має бути реалізовано за допомогою апаратного розширення (наприклад, GL_ARB_shadow), яке зазвичай не дозволяє вибирати між двома моделями освітлення (освітленим і затіненим) і вимагає більшої кількості проходів рендерингу:
1) Відрендерити всю сцену у тіні. Для найпоширеніших моделей освітлення (див. модель відбиття Фонга) це технічно має бути зроблено з використанням лише навколишнього компонента світла, але зазвичай до нього додають тьмяне розсіяне світло, щоб запобігти викривленим поверхням, які виглядають пласкими у тіні.
2) Увімкнути тест карти глибини і зробити сцену освітленою. Області, де тест карти глибини не пройшов успішно, не будуть перезаписані і залишаться затіненими.
3) Для кожного додаткового джерела світла можна використати додатковий прохід, використовуючи адитивне змішування, щоб поєднати їхній ефект з уже намальованими джерелами світла. (Кожен з цих проходів вимагає додаткового попереднього проходу для створення відповідної карти тіней).
Приклади зображень у цій статті використовують розширення OpenGLGL_ARB_shadow_ambient для виконання процесу картографування тіней за два проходи.
Реалізація тіньової проєкції в реальному часі
Одним з ключових недоліків картографування тіней у реальному часі є те, що розмір і глибина проєкції тіней визначають якість кінцевих тіней. Зазвичай це проявляється у вигляді аліасингу або збоїв безперервності тіней. Простий спосіб подолати це обмеження — збільшити розмір карти тіней, але через обмеження пам'яті, обчислювальних ресурсів або апаратного забезпечення це не завжди можливо. Для обходу цього обмеження були розроблені загальновживані методи для картографування тіней у реальному часі. До них належать каскадні тіньові карти, трапецієподібні тіньові карти, тіньові карти з перспективою світлового простору або паралельно-розділені тіньові карти.
Також слід зазначити, що згенеровані тіні, навіть якщо вони не містять аліасів, мають жорсткі краї, що не завжди бажано. Для імітації реальних м'яких тіней було розроблено кілька рішень, які передбачають виконання декількох пошуків на карті тіней, генерування геометрії для імітації м'яких країв або створення нестандартних карт тіней з глибиною. Яскравими прикладами таких рішень є відсоткова фільтрація, згладжування та карти тіней з дисперсією.
Техніки тіньового картографування
Проста
- SSM «Simple»
Розщеплення/Поділ
- PSSM «Parallel Split» https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM «Cascaded» http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
Викривлення/Деформація
- LiSPSM «Light Space Perspective» https://www.cg.tuwien.ac.at/research/vr/lispsm/
- TSM «Trapezoid» http://www.comp.nus.edu.sg/~tants/tsm.html
- PSM «Perspective» http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM «Camera Space» http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
Згладжування
- PCF «Percentage Closer Filtering» https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html
Фільтрування
- ESM «Exponential» http://www.cad.zju.edu.cn/home/jqfeng/papers/Exponential%20Soft%20Shadow%20Mapping.pdf
- CSM «Convolution» https://doclib.uhasselt.be/dspace/bitstream/1942/8040/1/3227.pdf
- VSM «Variance» http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM «Summed Area Variance» https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-8-summed-area-variance-shadow-maps
- SMSR «Shadow Map Silhouette Revectorization» http://bondarev.nl/?p=326
М'які тіні
- PCSS «Percentage Closer» http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
- SSSS «Screen space soft shadows» http://www.crcnetbase.com/doi/abs/10.1201/b10648-36
- FIV «Fullsphere Irradiance Vector» http://getlab.org/publications/FIV/
Різноманітні
- ASM «Adaptive» http://www.cs.cornell.edu/~kb/publications/ASM.pdf
- AVSM «Adaptive Volumetric» https://web.archive.org/web/20101208213624/http://visual-computing.intel-research.net/art/publications/avsm/
- CSSM «Camera Space» http://free-zg.t-com.hr/cssm/
- DASM «Deep Adaptive»
- DPSM «Dual Paraboloid» http://sites.google.com/site/osmanbrian2/dpsm.pdf
- DSM «Deep» http://graphics.pixar.com/library/DeepShadows/paper.pdf
- FSM «Forward» http://www.cs.unc.edu/~zhangh/technotes/shadow/shadow.ps
- LPSM «Logarithmic» http://gamma.cs.unc.edu/LOGSM/
- MDSM «Multiple Depth» http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.3376&rep=rep1&type=pdf
- RTW «Rectilinear» http://www.cspaul.com/wiki/doku.php?id=publications:rosen.2012.i3d
- RMSM «Resolution Matched» http://www.idav.ucdavis.edu/func/return_pdf?pub_id=919
- SDSM «Sample Distribution» https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- SPPSM «Separating Plane Perspective» http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- SSSM «Shadow Silhouette» http://graphics.stanford.edu/papers/silmap/silmap.pdf
Різне
- Shadow Depth Maps (SDM)[1]
- Perspective shadow maps (PSMs)
- Light Space Perspective Shadow Maps (LSPSMs)
- Cascaded Shadow Maps (CSMs)[2]
- Variance Shadow Maps (VSMs)[3]
Див. також
- Тіньовий об'єм, ще одна техніка затінення.
- Кастинг променів, повільніша техніка, яка часто використовується в трасуванні променів.
- Фотонне відображення, набагато повільніша техніка, здатна створювати дуже реалістичне освітлення.
- Radiosity, ще одна дуже повільна, але дуже реалістична техніка.
Подальше читання
- Smooth Penumbra Transitions with Shadow Maps Willem H. de Boer
- Forward shadow mapping performs the shadow test in eye-space rather than light-space to keep texture access more sequential.
Список літератури
- ↑ Common Techniques to Improve Shadow Depth Maps. Msdn.microsoft.com. Процитовано 7 листопада 2021.
- ↑ Cascaded Shadow Maps. Msdn.microsoft.com. Процитовано 7 листопада 2021.
- ↑ Donnelly, William; Lauritzen, Andrew (14 березня 2006). Variance shadow maps. Proceedings of the 2006 symposium on Interactive 3D graphics and games - SI3D '06. Association for Computing Machinery. с. 161—165. doi:10.1145/1111411.1111440. ISBN 159593295X.
{{cite book}}
:|access-date=
вимагає|url=
(довідка)
Ця стаття містить перелік джерел, але походження окремих тверджень у ній залишається незрозумілим через практично повну відсутність виносок. Будь ласка, допоможіть поліпшити цю статтю, додайте виноски з посиланнями на відповідні джерела до тексту статті. (серпень 2023) |
Посилання
- Hardware Shadow Mapping, nVidia
- Shadow Mapping with Today's OpenGL Hardware, nVidia
- Riemer's step-by-step tutorial implementing Shadow Mapping with HLSL and DirectX
- Improvements for Shadow Mapping using GLSL
- NVIDIA Real-time Shadow Algorithms and Techniques
- Shadow Mapping implementation using Java and OpenGL