Магический шар. Шейдер
Перевод небольшого отчета от Гарри Алисавакиса. Он делится тем, как на основе идеи построения оттеночной карты высот может получиться полупрозрачная текстура мрамора.
Примечание: В своем твите я говорил о “ray marching”, хотя данный термин здесь применим с натяжкой. При использовании цикла по перемещению в определенном направлении техника не совсем похожа на традиционный ray marching. Просто помните об этом.
Основная идея
Я постоянно думаю как бы еще использовать ранее освоенные эффекты, и в этот раз у меня возникла идея насчет «слоистого параллакса».
С помощью данной техники вы можете сэмплировать текстуру с использование координат “изнутри” объекта. Направление обзора камеры берется в касательном пространстве. Эффект очень полезен для добавления глубины льду, мраморной плитке и прочим вещам с подповерхностным рисунком. Выглядит он примерно так:
Мои мысли по поводу данного эффекта были следующими:
- Давайте отбросим основную текстуру пока она не нужна
- Что если в каждом «слое» этого эффекта выполнить «пошаговую» функцию для 2D-текстуры шума, со значением отсечки между 0 и 1, определяемым по «индексу» слоя?
На «шаги» (так я буду называть использование «пошаговой» функции) меня навела концепция использования для карты высот текстур в градациях серого. Регулировка значения обрезки простой текстуры с радиальным градиентом выглядит следующим образом:
Как если бы текстура действительно представляла конус, и при использовании «шагов» я вырезал из него ломтики, все более маленькие по мере приближения к вершине. Я слишком подробно объясняю суть карты расстояний, но такое представление помогло мне разобраться самому.
Таким образом, если бы я присвоил 1 значению среза самого верхнего слоя, 0 значению самого глубокого слоя и промежуточные значения промежуточным слоям, каждый слой смещения получил бы «ломтик» текстуры разного размера.
Если мы применим такой «шаг» к каждому слою текстуры с равномерным радиальным градиентом, мы получим примерно такую картинку (текстура разбита 10 раз, чтобы средние слои были видны лучше):
Чтобы получить гладкое изображение, достаточно лишь увеличить число слоев (здесь около 128):
Возьмем текстуру посложнее, как, например, для облака (для твердого материала это и будет наша текстура мрамора — прим.пер.). Получится следующее:
Экспериментировать с различными текстурами и шумами было очень весело.
Когда текстура мрамора накладывается на сферу, вы получите магический шар:
Добавьте 2 HDR цвета и перемещайтесь между ними на основе «индекса» слоя, а не просто уменьшая интенсивность от 0 до 1 (плюс еще немного постобработки для изображений):
Для большего разнообразия добавьте легкое волнообразное смещение при выборке текстуры — и вот она магия: