Як працюють шейдери Raymarch?


49

Я переглянув шейдери, знайдені тут shadertoy.com, і більшість крутих мають спільний шум та реймарх. Я взагалі не розумію вихідний код, але дуже хочу. Як працюють ці шейдери і як працює алгоритм реймарха? Я шукав всюди і нічого не можу знайти по темі.

Дякую


6
Іньіго Кілез написав чудові підручники з цього приводу. Дивіться iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm та iquilezles.org/www/articles/distfunctions/distfunctions.htm . Ці круті шейдери - це не просто будь-який рейммархінг, а конкретно рейммархінг дистанційних полів, який також називається сферою відстеження.
msell

Ви запитуєте про проміння променями взагалі чи проходження променів на GPU?
concept3d

@Milo Чи можете ви уточнити своє запитання? Ви запитуєте, як ці алгоритми використовуються для створення зображень, які ви бачите на класних демонстраціях? Ви запитуєте, як працює промінь? Ви запитуєте, як працює марш променів у фрагментах / піксельних шейдерах (тобто ефективна реалізація)?
TravisG

Я реалізував Raymarching в Unity Engine github.com/smkplus/UnityRayMarching
Сейєд Morteza Kamali

Відповіді:


79

Це, мабуть, найлегше зрозуміти на відміну від проміння.

Щоб зробити примітив із промінням, вам потрібна функція, яка, з огляду на примітивний та вхідний промінь, точно повідомляє, куди цей промінь потрапляє до примітиву. Тоді ви можете перевірити промінь на всі відповідні примітиви та вибрати найближчий перехрестя. Процесори в цьому хороші.

Якщо ви шукаєте рейммархінг, у вас немає такої простої функції перетину променів. Давши крапку на промені, ви можете оцінити, наскільки точка знаходиться до поверхні, але ви не знаєте точно, наскільки потрібно простягати цей промінь, щоб потрапити на поверхню.

Отже, ви "крокуєте" по черзі:

  1. Почніть з "початку" променя - найближчої площини для відображення сцени або перетину з обмежувальним об'ємом, якщо це лише один об'єкт у сцені. (P0 на схемі нижче)

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

  3. Просувайтесь вперед вздовж променя відповідно до вашої оцінки. Хід повинен бути консервативно коротким, так що ви впевнені, що ніде не пройдете тунель через поверхню.

  4. Тепер у вас є нова точка (P1 нижче) - отримайте нову оцінку і повторіть.

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

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

Маршируючи промінь від P0 до його перетину

Приклад діаграми з GPU Gems 2, глава 8

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

Точні кроки багато в чому залежать від конкретного ефекту, який ви намагаєтеся досягти. Техніки Raymarching використовуються з ...

  • поля висоти для імітації зміщення поверхні на традиційній растерізованій геометрії (картографування оклюзії паралакса)
  • буфери глибини сцени для речей, як відображення екранного простору
  • об'ємні текстури для візуалізації наборів даних з 3D-вибіркою (часто наукових / медичних)
  • неявні функції для надання таких речей, як фрактали
  • поля процедурної відстані, як у роботі Іньіго Кілеса (чудові посилання з msell в коментарях вище).

Raymarching також використовується для змішування на кожному кроці (часто використовують фіксовані кроки замість того, щоб оцінювати відстань кожен раз) для надання об'ємної прозорості, як у цьому прикладі з Вікіпедії .

Переглядаючи напівпрозору текстуру об'єму

Це стало популярним способом відображення детальних хмар у режимі реального часу .

Навіть картографічне оформлення інтер'єру , спосіб моделювання деталей інтер'єру кімнати за вікнами будівель, можна вважати формою захоплення, коли промінь крокує з точки, що потрапляє у вікно до найближчої площини стіни, підлоги / стелі чи меблів.

Якщо ви зацікавили конкретний тип ефекту, що вас цікавить, ви, ймовірно, можете отримати більш детальні відповіді, задавши нове запитання з конкретними прикладами. Як сім'я, техніка занадто різноманітна, щоб охопити все однією короткою відповіддю. ;) Я сподіваюся, що це дає вам основу для розуміння того, що відбувається під кришкою в цих шейдерах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.