Некоторое время назад в Another Angle Games мы начали проект, основанный на Unity. С тех пор мы экспериментировали со встроенным конвейером рендеринга вместе с несколько новой архитектурой SRP (Scriptable Render Pipeline с конвейером рендеринга высокой четкости, созданным Unity или HDRP для короткого и легкого конвейера рендеринга - LWRP).
В конце концов, мы остановились на HDRP - потенциал возможностей рендеринга, поддержка VFX Graph и прочие блестящие новые функции были слишком соблазнительными, чтобы мы просто отпустили их.
Однако было не так-то просто начать с ним работать. Нам все еще не удавалось создать индивидуальное освещение с использованием HDRP, но в целом все было довольно хорошо.
Что ж, все было довольно хорошо - до выпуска 2019.1.
Что случилось? Вышла новая версия HDRP. При этом - совершенно новая система постобработки, встроенная в конвейер, отличная от PPSv2, с которой мы были знакомы.
Затем, со вторым выпуском в цикле 2019 года, мы решили испачкать руки. Пришло время посмотреть, что происходит под капотом конвейера рендеринга высокой четкости.
Учебная часть
Как добиться пользовательской постобработки в HDRP 2019.X. Учебная часть.
Информация 1: на момент написания этой статьи не существовало официального API для расширения системы постобработки в unity 2019.X. Вскоре должен появиться способ добиться аналогичного эффекта с помощью Custom Pass, идущего в HDRP (дополнительную информацию см .: https://github.com/Unity-Technologies/ScriptableRenderPipeline/pull/4317), но пока это не так. т также доступны.
Информация 2. Возможно, это не самый простой или лучший способ реализовать пользовательские эффекты постобработки в Unity 2019.X с использованием HDRP, но он должен хотя бы работать. На момент написания этой статьи мы использовали 2019.2.0f1, но он также должен быть в основном совместим с 2019.1.
Этот процесс можно разделить на 3 этапа:
1. Разветвление источника HDRP и его повторное подключение к проекту
2. Изменение кода встроенной системы постобработки HDRP для создания использование настраиваемого шейдера
3. Написание собственного эффекта постобработки на HLSL
1. Разветвление источника HDRP и его повторное подключение в Unity.
Источники Scriptable Render Pipeline (ов) размещены на github.com, поэтому его очень легко разветвлять и изменять.
Переходим по адресу: https://github.com/Unity-Technologies/ScriptableRenderPipeline и нажимаем fork. Не забудьте использовать версию с номером версии, совместимую с вашей версией Unity. Например, для 2019.2 это HDRP 6.9.1.
Затем клонируйте его или просто скачайте как azip и создайте новый пустой проект в Unity 2019.X, используя High Definition RP.
Поскольку нам нужно переключить HDRP на нашу пользовательскую версию, теперь мы должны удалить его из нашего проекта. Чтобы удалить пакет из нашего проекта, откройте окно Window / Package Manager, найдите конвейер рендеринга высокой четкости и нажмите remove.
Это будет беспорядочно (шейдеры не будут компилироваться, вся сцена станет розовой), так как необходимые файлы будут отсутствовать в течение некоторого времени, но не беспокойтесь. Мы исправим это в кратчайшие сроки.
Теперь нам нужно использовать собственные пакеты в нашем проекте. К счастью, менеджер пакетов Unity теперь позволяет нам использовать пакеты с локальных дисков, поэтому использовать наш только что разветвленный проект SPR очень просто. Для этого просто нажмите кнопку + в верхнем левом углу окна диспетчера пакетов и выберите параметр Добавить пакет с диска….
Выберите package.json
, расположенный в:
[Place where you downloaded/cloned SRP repo/com.unity.render-pipelines.high-definition/package.json
После этого мы будем использовать нашу версию HDRP, загруженную из локальной файловой системы, которую мы можем легко изменить.
2. Модификация встроенной системы постобработки HDRP.
Главный файл системы постобработки находится в:
/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/PostProcessSystem.cs
Но прежде чем мы изменим это, мы должны создать файл шейдера, который будет использоваться для визуализации нашего пользовательского эффекта постобработки. Итак, давайте сделаем это. Создайте внутри файл:
Place where you downloaded/cloned SRP repo/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders
и называйте это как хотите. В нашем случае он называется Tutorial.shader
.
На данный момент содержимое этого файла может быть очень простым, например:
Шейдер сейчас ничего не делает. Он даже не определяет функции вершин и фрагментов, но мы разберемся с этим позже.
HDRP использует объект ScriptableObject RenderPipelineResources для сопоставления различных ресурсов файловой системы. Давайте добавим в этот файл наш недавно созданный шейдер. Открытым
/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPipelineResources.cs
и добавьте общедоступную переменную-член:
Теперь пришло время использовать наш недавно созданный шейдер, создать с ним материал и отобразить его на экране внутри PostProcessSystem. Для этого откройте
com.unity.render-pipelines.high-definition/Runtime/PostProcessing/PostProcessSystem.cs
и определите материал, который будет использоваться с:
Затем создайте экземпляр материала в системном конструкторе, используя только что созданный шейдер:
Чтобы быть милыми и вежливыми, мы должны убирать за собой, поэтому добавьте:
к методу public void Cleanup()
внутри PostProcessSystem.cs
Исходный исходный код содержит комментарий, указывающий, где лучше всего размещать пользовательские эффекты. Итак, около строки 460 мы можем добавить следующее:
Переменная m_Tutorial
- это наш VolumeComponent
- класс, который позволяет интегрировать наш собственный эффект постобработки в пользовательский интерфейс Unity. Содержание этого класса действительно зависит от того, какого типа эффект мы пытаемся достичь. Создайте внутри новый файл:
com.uniy.render-pipelines.high-definition/Runtime/PostProcessing/Components
Пример может быть таким:
Нам также необходимо получить данные компонента в PostProcessSystem
, чтобы иметь возможность использовать их и передавать значения шейдеру. Для этого добавьте строку, похожую на эту:
Последний шаг - создать метод DoTutorialPass
, который будет выполнять реальную работу.
Благодаря этому мы можем получить доступ к нашим VolumeComponent
данным, которые содержат все соответствующие настройки для нашего эффекта, передать их шейдеру и отрендерить окончательное изображение.
Теперь мы можем добавить наш компонент к объекту Volume
в Unity.
3. Написание пользовательского эффекта постобработки в HLSL.
Теперь все зависит от того, какого эффекта мы пытаемся добиться.
Будет работа по созданию кода шейдера, дальнейшему расширению VolumeComponent
и передаче данных между PostProcessSystem
и шейдером.
Мы не будем рассматривать этот шаг слишком подробно, так как он может варьироваться в зависимости от того, какого эффекта вы хотите достичь. Но если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже - мы постараемся помочь.
Заключение:
На данный момент Unity не предоставляет нам API для системы постобработки, встроенной в High-Definition RP. Мы полагаем, что метод, показанный в этой статье, является одним из многих способов реализации некоторой пользовательской постобработки в HDRP - если вы знаете о более эффективном способе, сообщите нам об этом.
Если вы похожи на нас и вам нужны как новые функции, которые поставляются с новыми версиями Unity, так и возможность выполнять некоторую индивидуальную работу, следуйте шагам, описанным ранее. Это не так сложно, как может показаться.