Це, мабуть, найлегше зрозуміти на відміну від проміння.
Щоб зробити примітив із промінням, вам потрібна функція, яка, з огляду на примітивний та вхідний промінь, точно повідомляє, куди цей промінь потрапляє до примітиву. Тоді ви можете перевірити промінь на всі відповідні примітиви та вибрати найближчий перехрестя. Процесори в цьому хороші.
Якщо ви шукаєте рейммархінг, у вас немає такої простої функції перетину променів. Давши крапку на промені, ви можете оцінити, наскільки точка знаходиться до поверхні, але ви не знаєте точно, наскільки потрібно простягати цей промінь, щоб потрапити на поверхню.
Отже, ви "крокуєте" по черзі:
Почніть з "початку" променя - найближчої площини для відображення сцени або перетину з обмежувальним об'ємом, якщо це лише один об'єкт у сцені. (P0 на схемі нижче)
Оцініть свою дистанційну функцію, щоб отримати оцінку наближеності до поверхні. (Найбільше коло на діаграмі)
Просувайтесь вперед вздовж променя відповідно до вашої оцінки. Хід повинен бути консервативно коротким, так що ви впевнені, що ніде не пройдете тунель через поверхню.
Тепер у вас є нова точка (P1 нижче) - отримайте нову оцінку і повторіть.
Продовжуйте отримувати оцінки та крокуйте вперед, поки не досягнете граничної відстані від поверхні або не досягнете максимальної кількості кроків. (P4 нижче)
Тепер ви маєте глибину поверхні, і ви можете зробити висновки, як нормали / оклюзія навколишнього середовища з сусідніх зразків, і використовувати ці дані для освітлення та забарвлення пікселя.
Приклад діаграми з GPU Gems 2, глава 8
Оскільки кожен промінь незалежний і використовує (загалом) лише локальну інформацію на кожному кроці, він дозріває для паралелізації на графічних процесорах. Часто на екрані будуть намальовані лише два трикутники. Після растрування їх кожен піксель, переданий фрагменту шейдера, являє собою єдиний промінь. Фрагмент шейдера рухає цей промінь, поки він не вийде на поверхню, повертаючи результат (часто просто значення глибини для текстурування та затінення в окремому проході на весь екран).
Точні кроки багато в чому залежать від конкретного ефекту, який ви намагаєтеся досягти. Техніки Raymarching використовуються з ...
- поля висоти для імітації зміщення поверхні на традиційній растерізованій геометрії (картографування оклюзії паралакса)
- буфери глибини сцени для речей, як відображення екранного простору
- об'ємні текстури для візуалізації наборів даних з 3D-вибіркою (часто наукових / медичних)
- неявні функції для надання таких речей, як фрактали
- поля процедурної відстані, як у роботі Іньіго Кілеса (чудові посилання з msell в коментарях вище).
Raymarching також використовується для змішування на кожному кроці (часто використовують фіксовані кроки замість того, щоб оцінювати відстань кожен раз) для надання об'ємної прозорості, як у цьому прикладі з Вікіпедії .
Це стало популярним способом відображення детальних хмар у режимі реального часу .
Навіть картографічне оформлення інтер'єру , спосіб моделювання деталей інтер'єру кімнати за вікнами будівель, можна вважати формою захоплення, коли промінь крокує з точки, що потрапляє у вікно до найближчої площини стіни, підлоги / стелі чи меблів.
Якщо ви зацікавили конкретний тип ефекту, що вас цікавить, ви, ймовірно, можете отримати більш детальні відповіді, задавши нове запитання з конкретними прикладами. Як сім'я, техніка занадто різноманітна, щоб охопити все однією короткою відповіддю. ;) Я сподіваюся, що це дає вам основу для розуміння того, що відбувається під кришкою в цих шейдерах.