WebGL-портфолио Susurrus: акварельный 3D-мир на Three.js и Kuwahara-шейдере
Перевод case-study Wei Xianyao о Susurrus: WebGL-сцена в стиле акварели, построенная вокруг одного Kuwahara-фильтра в постпроцессинге. Стек React Three Fiber, отражающая вода через MeshReflectorMaterial с низким разрешением, reveal-эффект через ScrollControls + ScreenQuad. С шейдер-кодом.
Чем это могло бы быть, если бы 3D-сцена в браузере вела себя как акварельный рисунок — текучая, отзывчивая, интерактивная? Дизайнер Wei Xianyao (Weisdevice) опубликовал case-study на Codrops о проекте Susurrus: WebGL-сцена, целиком построенная вокруг одного Kuwahara-шейдера в постпроцессинге, с отражающей водой, физикой и звуком. Перевод материала.
Главный приём — Kuwahara-фильтр как единственный пасс постпроцессинга. Всё остальное (отражения, частицы, реакция на скролл, физика появления хлеба по клику) встроено вокруг него и подгоняется под его эстетику.
Главное
Ключевые выводы
Концепция. Забытая мельница на воде, рендерится как акварель, но полноценно 3D и интерактивна. Вода, ветер, сцена — единое атмосферное пространство. Под мирным фасадом скрыт сюрреалистический намёк: подводная мельница бесконечно производит хлеб, хотя зерно давно ушло.
Стек. React, React Three Fiber, Drei, React Three Rapier, Howler.js, TypeScript, WebGL, HTML/SCSS.
Главный приём — Kuwahara-шейдер. Несмотря на сильно обработанный вид, это единственный пасс постпроцессинга. Сцена строится вокруг него, в том числе на этапе моделей в Blender — чтобы видеть итоговый эффект сразу.
Отражающая вода — три шага. MeshReflectorMaterial в низком разрешении (для производительности), кастомный шейдер сверху для деталей и анимации воды, тюнинг освещения.
Reveal Effect. ScrollControls контролирует параметр uProgress, шейдер применён к ScreenQuad. Это компактный способ реализовать разворачивающуюся при скролле интро-сцену.
Концепция: уют, которого не бывает
Wei работает в свободном режиме: не использует Figma и подобные инструменты на личных проектах, идёт от концепта в голове. Susurrus родился как «эхо в сознании»: дом, плавающий на отражающей воде, с Kuwahara-шейдером, наложенным как пост-процессинг — чтобы получить «3D-веб-впечатление как картина».
Интерфейс при этом намеренно прост — фокус на 3D-контенте. В сцене присутствуют два поэта, но смысловое ядро — атмосфера и эмоция, переданные через визуал и звук. Само слово «susurrus» (шёпот, шорох) задаёт тон: слова намеренно невнятны, важнее — настроение.
При ближнем рассмотрении сцена становится тревожной: подводная мельница бесконечно производит хлеб, хотя зерна давно нет. Это тихая метафора несуществующего комфорта — то, что выглядит решённым, но к чему присматриваться не стоит.
Kuwahara-шейдер: ядро всего проекта
Весь визуальный стиль Susurrus построен на Kuwahara-фильтре. Это единственный пасс постпроцессинга — всё остальное собрано вокруг него. Wei поставил его на этап раньше, чем закончил 3D-модели в Blender: так можно видеть итоговый эффект и подгонять модели под шейдер, а не получить сюрприз в финале.
При исследовании автор нашёл несколько подходов, опираясь в основном на разбор Maxime Heckel о Kuwahara-фильтре и painterly-шейдинге. На основе этих референсов Wei сделал упрощённую реализацию:
- Не использовал TensorPass, чтобы пасс остался простым (хотя он усиливает детализацию).
- Использовал отличающийся подход на vertex-стадии, по сравнению со стандартными реализациями.
Стандартный vertex для Kuwahara обычно выглядит так:
Версия Wei проще:
Wei не применяет полную модель-вью-проекционную матрицу (MVP), чтобы немного ускорить вычисления. Цена компромисса — эффект слабее, когда камера подходит близко, но в Susurrus камера не приближается к моделям анимацией, поэтому это ОК.
Отражающая вода в три шага
Авторская «грязная» реализация воды:
- MeshReflectorMaterial в акварельном стиле. Из-за визуальной обработки разрешение можно ставить очень низким — это сохраняет производительность на мобильных и десктопе.
- Кастомный шейдер на отдельной плоскости поверх MeshReflectorMaterial — добавляет детали и анимацию воды.
- Освещение подкручено так, чтобы вода казалась живее, не плоской и не скучной.
Reveal Effect для интро-сцены
Wei использовал ScrollControls для контроля параметра uProgress, который подаётся в reveal-шейдер. Шейдер применён к ScreenQuad — это удобный способ реализовать эффект «открытия» сцены при скролле.
Звук, физика и адаптивность
Звуковые эффекты. Через react-howler: разные звуковые взаимодействия по hover/click. Эффекты интегрированы с фоновой музыкой, чтобы получился lo-fi-стиль — «картина, которая может петь».
Физика. Главный интерактивный элемент Susurrus — Spawning Bread on Click: щелчок порождает физический объект (хлеб), который падает в сцену. На реализации стоит React Three Rapier.
Адаптивность. Стандартная для автора цель — мобильная совместимость и плавная производительность на mobile и более старых устройствах.
Часто задаваемые вопросы
Что такое Kuwahara-фильтр и почему он популярен в creative coding?
Это нелинейный фильтр сглаживания, изначально разработанный для медицинской обработки изображений. Он разбивает окрестность пикселя на четыре квадранта, считает дисперсию каждого и берёт значение из квадранта с минимальной дисперсией. Это даёт характерный «живописный» эффект — сглаживание сохраняет резкие края, в результате изображение похоже на painterly-стиль. Часто используется в creative coding для эстетики «акварели/масла» в реальном времени.
Стек тяжёлый — это работает на мобильных?
Wei специально оптимизировал под мобильные. MeshReflectorMaterial в низком разрешении, упрощённый vertex-шейдер для Kuwahara (без MVP-матриц), один-единственный пасс постпроцессинга. Адаптивность была одной из главных целей с самого начала.
Можно ли посмотреть исходники?
Полные исходники Susurrus автор не выложил, но в case-study на Codrops приведены ключевые фрагменты шейдеров и React-компонентов. По ссылкам на портфолио Wei (Weisdevice) можно найти контакты для прямого вопроса.
Выводы
Susurrus — пример того, как один точно выбранный шейдер может задать стиль всему проекту: от моделей в Blender до анимации воды и интерактивности. Идея Wei — начать с Kuwahara-фильтра ещё до финальных моделей — практичная: видишь итоговый эффект сразу и не тратишь время на проработку деталей, которые шейдер всё равно сгладит.
Для тех, кто работает с Three.js / React Three Fiber, в случае Susurrus есть три прямых заимствования: компактный паттерн ScrollControls + ScreenQuad для reveal-сцен, дешёвая реализация отражающей воды через MeshReflectorMaterial низкого разрешения + кастомный шейдер сверху, и выбор пасса постпроцессинга на старте проекта, а не в финале.
Источник: Susurrus: Crafting a Cozy Watercolor World with Three.js and Shaders — Codrops.