Как работают шейдеры Raymarch?

Я смотрю на шейдеры, найденные здесь shadertoy.com, и большинство из них имеют шум и raymarch. Я вообще не понимаю исходный код, но я действительно этого хочу. Как работают эти шейдеры и как работает алгоритм raymarch? Я искал все и не могу найти что-либо по этой теме.

Спасибо

45 голосов | спросил jmasterx 22 SunEurope/Moscow2013-12-22T04:13:30+04:00Europe/Moscow12bEurope/MoscowSun, 22 Dec 2013 04:13:30 +0400 2013, 04:13:30

1 ответ


73

Это, пожалуй, проще всего понять в отличие от raytracing.

Для рендеринга примитива с raytracing вам нужна функция, которая, учитывая примитивный и входной луч, сообщает вам, где именно луч попадает на примитив. Затем вы можете проверить луч против всех соответствующих примитивов и выбрать ближайший перекресток. Процессоры хороши в этом.

С raymarching у вас нет такой простой функции пересечения лучей. Учитывая точку на луче, вы можете оценить, насколько близко точка к поверхности, но вы точно не знаете, как далеко вы должны расширить этот луч, чтобы попасть на поверхность.

Итак, вы «маршируете» один шаг за раз:

  1. Начните с «начала» луча - ближней плоскости для рендеринга сцены или пересечения с ограничивающим объемом, если это всего лишь один объект в сцене. (P0 на диаграмме ниже)

  2. Оцените свою дистанционную функцию, чтобы получить оценку того, насколько вы близки к поверхности. (Наибольший круг на диаграмме)

  3. Двигайтесь вперед по лучу в соответствии с вашей оценкой. Этот шаг должен быть консервативно коротким, поэтому вы уверены, что вы не будете проходить через поверхность где-нибудь.

  4. Теперь у вас есть новая точка (P1 ниже) - получите новую оценку и повторите.

  5. Продолжайте получать оценки и продвигаться вперед, пока не достигнете порогового расстояния поверхности, или вы не достигнете максимального количества шагов. (P4 ниже)

  6. Теперь у вас есть глубина поверхности, и вы можете вывести такие вещи, как нормаль /окружающая окклюзия из соседних образцов, и использовать эти данные для освещения & цвет пикселя.

Проведение луча от P0 к его пересечению

Пример диаграммы из Графиков GPU 2, глава 8

Поскольку каждый луч является независимым и использует (обычно) только локальную информацию на каждом шаге, он созрел для распараллеливания на графических процессорах. Часто на экране отображаются только два треугольника. После их растеризации каждый пиксель, переданный в шейдер фрагмента, представляет собой один луч. Фрагментный шейдер марширует этот луч до тех пор, пока он не достигнет поверхности, возвращая результат (часто просто значение глубины для текстурирования и затенения в отдельном полноэкранном проходе).

Точные шаги зависят от конкретного эффекта, который вы пытаетесь достичь. Методы Raymarching используются с ...

  • высоты для моделирования перемещения поверхности на традиционной растрированной геометрии (отображение окклюзии параллакса)
  • буферы глубины сцены для таких вещей, как отражение пространства экрана.
  • объемные текстуры для визуализации 3D-выборки наборов данных (часто научных /медицинских)
  • неявные функции для рендеринга таких вещей, как фракталы
  • процедурные поля расстояния, как в Работа IÃ ± igo Quilez (отличные ссылки от msell в комментариях выше).

Raymarching также используется для смешивания на каждом шаге (часто используя фиксированные шаги вместо оценки расстояния каждый раз) для рендеринга объемной полупрозрачности, как в этот пример из Википедии .

Raymarching полупрозрачная текстура тома

Это стало популярным способом отображает подробные облака в реальном времени .

Даже Внутреннее сопоставление , способ моделирования внутренних деталей комнаты за окнами здания, можно рассматривать как форму raymarching, где луч отходит от точки, которая входит в окно к ближайшей стене, полу /потолку или мебели.

Если вам нужен определенный тип эффекта raymarching, вы, вероятно, можете получитьболее подробные ответы, задавая новый вопрос с конкретными примерами. Как семья, техника слишком разнообразна, чтобы покрыть все одним коротким ответом. ;) Надеюсь, это даст вам основу для понимания того, что происходит под капотом в этих шейдерах.

ответил DMGregory 22 SunEurope/Moscow2013-12-22T20:20:39+04:00Europe/Moscow12bEurope/MoscowSun, 22 Dec 2013 20:20:39 +0400 2013, 20:20:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132