Это, вероятно, легче всего понять в отличие от трассировки лучей.
Чтобы визуализировать примитив с помощью трассировки лучей, вам нужна функция, которая, учитывая примитив и входной луч, точно указывает, где этот луч попадает в примитив. Затем вы можете проверить луч по всем соответствующим примитивам и выбрать ближайший перекресток. Процессоры хороши в этом.
С raymarching у вас нет такой простой функции пересечения лучей. Учитывая точку на луче, вы можете оценить, насколько близко точка находится к поверхности, но вы точно не знаете, как далеко вам нужно расширить этот луч, чтобы попасть на поверхность.
Итак, вы «шагаете» по одному шагу за раз:
Начните с «начала» луча - ближней плоскости рендеринга сцены или пересечения с ограничивающим объемом, если это только один объект в сцене. (P0 на диаграмме ниже)
Оцените свою функцию расстояния, чтобы получить оценку того, насколько близко вы находитесь к поверхности. (Самый большой круг на диаграмме)
Двигайтесь вперед по лучу согласно вашей оценке. Движение должно быть консервативно коротким, поэтому вы уверены, что никуда не пробьетесь.
Теперь у вас есть новая точка (P1 ниже) - получите новую оценку и повторите.
Продолжайте получать оценки и шагайте вперед, пока не достигнете порогового расстояния от поверхности или не достигнете максимального числа шагов. (P4 ниже)
Теперь у вас есть глубина поверхности, и вы можете выводить такие вещи, как нормаль / окклюзия окружающей среды из близлежащих образцов, и использовать эти данные для освещения и окрашивания пикселя.
Пример диаграммы из GPU Gems 2, глава 8
Поскольку каждый луч независим и использует (как правило) только локальную информацию на каждом этапе, он подходит для распараллеливания на графических процессорах. Часто на экране будут нарисованы только два треугольника. После их растеризации каждый пиксель, переданный фрагментному шейдеру, представляет один луч. Фрагментный шейдер марширует этот луч до тех пор, пока он не достигнет поверхности, возвращая результат (часто только значение глубины для текстурирования и затенения в отдельном полноэкранном проходе).
Точные шаги во многом зависят от конкретного эффекта, которого вы пытаетесь достичь. Методы Raymarching используются с ...
- Высота полей для имитации смещения поверхности на традиционной растеризованной геометрии (параллакс окклюзионное картирование)
- буферы глубины сцены для таких вещей, как отражения в пространстве экрана
- объемные текстуры для визуализации 3D-наборов данных (часто научных / медицинских)
- неявные функции для рендеринга таких вещей, как фракталы
- поля процедурного расстояния, как в работе Иньго Квилеса (отличные ссылки от msell в комментариях выше).
Raymarching также используется с наложением на каждом шаге (часто с использованием фиксированных шагов вместо оценки расстояния каждый раз) для визуализации объемной прозрачности, как в этом примере из Википедии .
Это стало популярным способом рендеринга детализированных облаков в реальном времени .
Даже отображение интерьера , способ имитировать детали интерьера комнаты за окнами здания, можно рассматривать как форму построения лучей, когда луч проходит от точки, в которую он попадает в окно, к ближайшей стене, полу / потолку или плоскости мебели.
Если вас интересует какой-то особый тип лучевого эффекта, вы можете получить более подробные ответы, задав новый вопрос с конкретными примерами. Как семья, техника слишком разнообразна, чтобы охватить все одним коротким ответом. ;) Надеюсь, это даст вам основу для понимания того, что происходит под капотом в этих шейдерах.