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