render pipeline unity что это
Unity’s Rendering Pipeline
Shaders define both how an object looks by itself (its material properties) and how it reacts to the light. Because lighting calculations must be built into the shader, and there are many possible light & shadow types, writing quality shaders that “just work” would be an involved task. To make it easier, Unity has Surface Shaders, where all the lighting, shadowing, lightmapping, forward vs. deferred rendering things are taken care of automatically.
This document describes the pecularities of Unity’s lighting & rendering pipeline and what happens behind the scenes of Surface Shaders.
Rendering Paths
How lighting is applied and which Passes of the shader are used depends on which Rendering Path is used. Each pass in a shader communicates its lighting type via Pass Tags.
Forward Rendering path
ForwardBase pass renders ambient, lightmaps, main directional light and not important (vertex/SH) lights at once. ForwardAdd pass is used for any additive per-pixel lights; one invocation per object illuminated by such light is done. See Forward Rendering for details.
If forward rendering is used, but a shader does not have forward-suitable passes (i.e. neither ForwardBase nor ForwardAdd pass types are present), then that object is rendered just like it would in Vertex Lit path, see below.
Deferred Shading path
Deferred pass renders all information needed for lighting (in built-in shaders: diffuse color, specular color, smoothness, world space normal, emission). It also adds lightmaps, reflection probes and ambient lighting into the emission channel. See Deferred Shading for details.
Legacy Deferred Lighting path
PrepassBase pass renders normals & specular exponent; PrepassFinal pass renders final color by combining textures, lighting & emissive material properties. All regular in-scene lighting is done separately in screen-space. See Deferred Lighting for details.
Legacy Vertex Lit Rendering path
Since vertex lighting is most often used on platforms that do not support programmable shaders, Unity can’t create multiple shader variants internally to handle lightmapped vs. non-lightmapped cases. So to handle lightmapped and non-lightmapped objects, multiple passes have to be written explicitly.
Масштабируемая и высокая производительность рендеринга
Universal Render Pipeline от Unity стал мощным решением, сочетающим красоту, скорость и производительность, а также поддержку всех целевых платформ Unity.
Universal Render Pipeline — это:
В Universal Render Pipeline постобработка встроена непосредственно в процесс рендеринга, обеспечивая высокую производительность. Разработчикам доступны такие эффекты, как сглаживание, глубина резкости, размытие в движении, проекция Панини, блеск, искажение линзы, хроматические аберрации, цвето- и тонокоррекция, виньетка, зернистость и 8-битный дизеринг.
Universal Render Pipeline
Упор на производительность
Однопроходный упреждающий рендеринг
Поддержка Shader Graph
Встроенный процесс рендеринга
Универсальность
Поддерживает как упреждающий, так и отложенный рендеринг
От 2D и 3D до AR/VR-проектов: Universal Render Pipeline позволяет не тратить время на доработку проекта для выпуска на новом устройстве.
Возможность конфигурации рендеринга в Unity с помощью скриптов на C# позволяет вам:
Universal Render Pipeline проще, чем встроенный процесс рендеринга, но улучшает качество графики. Перевод проекта со встроенного процесса рендеринга на Universal Render Pipeline должен обеспечивать аналогичную или улучшенную производительность. Прочтите статью в нашем блоге, чтобы узнать о том, как Universal Render Pipeline повышает частоту кадров без снижения качества графики.
Вы можете воспользоваться преимуществами готовых технологий уже сегодня. Обновите проекты с помощью средств перехода или создайте новый проект на основе нашего шаблона Universal через Unity Hub.
Графика высокого разрешения воплотит ваши творческие планы
High Definition Render Pipeline (HDRP) обеспечивает непревзойденную производительность графического процессора. Вам доступен любой стиль, от фотореализма до стилизованной графики.
Unity предлагает два готовых процесса: High-Definition Render Pipeline (HDRP) и Universal Render Pipeline. Каждый из них имеет свою область применения и системные требования.
С помощью SRP можно управлять и настраивать рендеринг посредством скриптов на C#. Это позволяет не только вносить небольшие изменения, но и полностью перерабатывать и настраивать процесс рендеринга в соответствии с вашими требованиями.
Имея в арсенале универсальные средства физического рендеринга и бескомпромиссную эффективность использования графического процессора, HDRP создан специально для амбициозных проектов с графикой высокого разрешения.
HDRP предназначен для высокопроизводительных платформ, включая ПК, Xbox и PlayStation. Он позволяет обеспечить реалистичную графику в сложных сценариях. В HDRP используются технология Compute Shader и возможности современных графических процессоров.
HDRP можно использовать в разработке игр высокого разрешения, автомобильных демонстраций, архитектурных и других приложений, где приоритет отдается качеству графики. HDRP поддерживает как упреждающий, так и отложенный рендеринг, и использует физическое освещение и материалы.
HDRP — это огромный технологический скачок в области реализма графики, а также повышенное удобство использования.
Процесс создан специально для игр на современных консолях и ПК.
Настраиваемый стек постобработки позволяет создавать эффекты, автоматически интегрируемые в систему объема. Custom Render Pass позволяет добавлять шейдеры и код на C# в определенные моменты цикла рендеринга для отрисовки объектов, выполнения полноэкранных проходов и считывания данных из буфера камеры, включая глубину, цвет и нормали.
Look Dev представляет собой инструмент освещения, который позволяет проверять и сравнивать ассеты с помощью их визуализации, а также проверять правильность их работы при разных настройках освещения. Проверить ассет можно мгновенно, ведь он отображается в инструменте именно так, как будет отображаться в приложении.
Благодаря параметрам масштабирования вы можете создавать массивы HDRP-ассетов для проекта, каждый из которых будет иметь разные настройки качества графики. Это значит, что пользователи вашего приложения смогут выбрать уровень качества графики, соответствующий параметрам их оборудования.
Unity 2019.3 содержит улучшения алгоритмов Depth of Field, Screen Space Ambient Occlusion, системы теней (упрощенной), системы программирования освещения, а также интерфейса работы с освещением. Мы добавили поддержку DiscLight (только для запекания), оттенков полутеней, а также документацию к функциям API и графики.
Студия использовала стек постобработки, чтобы добиться кинематографического качества графики и физически корректного поведения камер, и все это — с рендерингом в реальном времени.
В демофильме также показаны цифровые модели людей с отрисовкой в реальном времени. В проекте использовались данные, полученные с помощью 3D- и 4D-сканирования для захвата текстур и движений. Создатели разработали полностью готовый процесс, от сбора данных до рендеринга в реальном времени в Unity, используя услуги различных поставщиков. Для отрисовки использовались все шейдеры, необходимые для достижения желаемого качества графики с применением HDRP.
Приключенческая игра с сильным сюжетом и множеством возможностей исследовать игровой мир. Инновационные технологии покадровой анимации воплощены с помощью различных инструментов Unity, в том числе фотограмметрии и HDRP, а сочетание Timeline и Cinemachine открыло для студии возможности нелинейного монтажа
Разработчики из Multiverse создали игру с богатой графикой и инопланетными, но не менее живыми окружениями. Такое качество было достигнуто благодаря использованию множества эффектов HDRP, например, настройки экспозиции, тонокоррекции, подповерхностного рассеивания, объемного освещения, цветокоррекции и искажения линз. В результате получился впечатляюще красивый мир, который демонстрирует стабильную производительность на уровне 60 кадров в секунду даже во время напряженных схваток с толпами врагов.
Scriptable Render Pipeline
The SRP gives you more granularity and customization options than the built-in Unity render pipeline. And you can use one of the pre-built SRPs to target your specific needs.
Using an SRP is different from using the built-in Unity render pipeline. For example, the pre-built SRPs come with a new Shader A small script that contains the mathematical calculations and algorithms for calculating the Color of each pixel rendered, based on the lighting input and the Material configuration. More info
See in Glossary library. This is because the Lit shaders from the built-in render pipeline, and custom Lit shaders, do not work with SRPs. You can upgrade the built-in Lit shaders to both LWRP and HDRP.
Note: This is a preview feature and is subject to change. Any scripts that use this feature may need updating in a future release. Do not rely on this feature for full-scale production until it is no longer in preview.
Pre-built SRPs
Unity has built two Scriptable Render Pipelines that use the SRP framework: the High Definition Render Pipeline (HDRP) and the Lightweight Render Pipeline (LWRP). Each render pipeline targets a specific set of use-case scenarios and hardware needs. The pre-built render pipelines are available as templates for new Projects.
Both of these render pipelines are delivered as packages via the Package Manager window in Unity. They both include the Shader Graph and Post-processing packages.
Note: LWRP and HDRP are not compatible with each other, and neither is compatible with the built-in Render Pipeline. Before you start development, you must decide which render pipeline to use in your Project.
High Definition Render Pipeline
The HDRP targets high-end hardware like consoles and PCs. With the HDRP, you’re able to achieve realistic graphics in demanding scenarios. The HDRP uses Compute Shader technology and therefore requires compatible GPU hardware.
Use HDRP for AAA quality games, automotive demos, architectural applications and anything that favors high-fidelity graphics over performance. HDRP uses physically-based Lighting and Materials, and supports both Forward and Deferred rendering.
The High Definition Render Pipeline is provided in a single template.
For more information on HDRP, see the HDRP overview on the SRP GitHub Wiki.
Lightweight Render Pipeline
You can use the LWRP across a wide range of hardware. The technology is scalable to mobile platforms, and you can also use it for higher-end consoles and PCs. You’re able to achieve quick rendering at a high quality. LWRP uses simplified, physically based Lighting and Materials.
The Lightweight Render Pipeline is available via two templates: LWRP and LWRP-VR. The LWRP-VR comes with pre-enabled settings specifically for VR.
To see the latest documentation for LWRP, go to Package Manager in Unity, navigate to the Lightweight Render Pipeline package, and click View Documentation.
Setting up a Scriptable Render Pipeline
There are several different ways to install SRP, HDRP and LWRP: If you want to use one of the pre-built SRPs in a new or current Project, continue reading this section. If you are an advanced user, and you want to modify the SRP scripts to directly, see Creating a custom SRP.
Using a pre-built SRP with a new Project
If you want to use the HDRP or the LWRP in a new Project, and you don’t need to customise the render pipeline, you can create a new Project using Templates.
To create a Project using Templates:
For more information on using Templates, see Project Templates.
Installing the latest SRP into an existing Project
You can download and install the latest version of HDRP, LWRP or SRP to your existing Project via the Package Manager system.
Switching to an SRP from an existing Project consumes a lot of time and resources. HDRP, LWRP and custom SRPs all use custom shaders. They are not compatible with the built-in Unity shaders. You will have to manually change or convert many elements. Instead, consider starting a new Project with your SRP of choice.
To install an SRP into an existing Project:
Configuring and using a pre-built render pipeline
Before you can use either of the pre-built render pipelines, you must create a Render Pipeline Asset Any media or data that can be used in your game or Project. An asset may come from a file created outside of Unity, such as a 3D model, an audio file or an image. You can also create some asset types in Unity, such as an Animator Controller, an Audio Mixer or a Render Texture. More info
See in Glossary and add it to your Project settings. The following sections explain how to create the SRP Asset and how to add it to an HDRP or LWRP.
Creating Scriptable Render Pipeline Assets
To properly use your chosen SRP, you must create a Scriptable Render Pipeline Asset.
The Scriptable Render Pipeline Asset controls the global rendering Quality settings of your Project and creates the rendering pipeline instance. The rendering pipeline instance contains intermediate resources and the render pipeline implementation.
You can create multiple Pipeline Assets to store settings for different platforms or for different testing environments.
To create a Render Pipeline Asset:
Note: HDRP and LWRP are not compatible with each other, because they use different lighting models. Your Project must use one or the other. You can, however, use different Assets with the same render pipeline. This means that you can test different settings using different Assets by swapping between them, instead of changing individual settings.
Configuring and using HDRP
To use HDRP, you must edit your Project’s Player and Graphics settings as follows:
Tip: Always store your High Definition Render Pipeline Asset outside of the Scriptable Render Pipeline folder. This ensures that your HDRP settings are not lost when merging new changes from the SRP GitHub repository.
Configuring and using LWRP
To use the LWRP, you must edit your Project’s Graphics settings as follows:
Tip: Always store your new Lightweight Render Pipeline Asset outside of the Scriptable Render Pipeline folder. This ensures that your Lightweight settings are not lost when merging new changes from the SRP GitHub repository.
Creating a custom SRP
The Scriptable Render Pipelines are available in an open Project on GitHub. You can clone an SRP and make modifications in your local version.
To configure local script files for a new or existing Unity Project:
Create a clone of the SRP repository. Place the clone in the root of the Project directory, next to the Assets folder. For information on cloning repositories, see the GitHub help on Cloning a repository.
In your Project manifest, update dependencies to so that they point to the SRP packages. To read more about Project manifests, see the Package Manager documentation. Here is an example of what your script should look like:
Open your Project in Unity. Your packages are now installed locally. When you open the Project solution in an integrated development environment, you can debug and modify the script directly.
2018–12–12 Page amended with editorial review
Preview of Scriptable Render Pipeline added in 2018.1 NewIn20181
Did you find this page useful? Please give it a rating:
Создание Outline эффекта в Unity Universal Render Pipeline
В Universal Render Pipeline, создавая свои RendererFeature, можно легко расширить возможности отрисовки. Добавление новых проходов в конвеер рендеринга позволяет создавать различные эффекты. В этой статье, используя ScriptableRendererFeature и ScriptableRenderPass, создадим эффект обводки объекта (Outline) и рассмотрим некоторые особенности его реализации.
Вступление или пару слов о Render Pipeline
Scriptable Render Pipeline позволяет управлять отрисовкой графики посредством скриптов на C# и контролировать порядок обработки объектов, света, теней и прочего. Universal Render Pipeline — это готовый Scriptable Render Pipeline, разработанный Unity и предназначенный на замену старому встроенному RP.
Возможности Universal RP можно расширить, создавая и добавляя свои проходы отрисовки ( ScriptableRendererFeature и ScriptableRenderPass ). Об этом и будет текущая статья. Она пригодится тем, кто собирается переходить на Universal RP и, возможно, поможет лучше понимать работу имеющихся ScriptableRenderPass’ов в Universal RP.
При написании этой статьи использовалась Unity 2019.3 и Universal RP 7.1.8.
План действий
Мы будем разбираться в работе ScriptableRendererFeature и ScriptableRenderPass на примере создания эффекта обводки непрозрачных объектов.
Для этого создадим ScriptableRendererFeature, выполняющую следующие действия:
И последовательность результатов, которые мы должны достичь:
В ходе работы мы создадим шейдер, в глобальные свойства которого будут сохраняться результаты первого и второго проходов. Последний проход отобразит результат работы самого шейдера на экран.
Это свойства, объявленные в шейдере, но не имеющие определения в блоке Properties. В данном примере нет принципиальной разницы как мы будем задавать текстуры — через глобальные или обычные свойства.
Основная причина использования глобальных свойств — нет необходимости передавать материал каждому проходу. А также отладка становится немного удобнее.
Создаём OutlineFeature
ScriptableRendererFeature используется для добавления своих проходов отрисовки (ScriptableRenderPass) в Universal RP. Создадим класс OutlineFeature, наследуемый от ScriptableRenderFeature и реализуем его методы.
Метод Create() служит для создания и настройки проходов. А метод AddRenderPasses() для внедрения созданных проходов в очередь отрисовки.
ScriptableRenderer — текущая стратегия рендеринга по умолчанию для Universal RP. На данный момент в Universal RP реализована только стратегия Forward Rendering.
RenderingData содержит данные для настройки проходов отрисовки — данные об отбраковке, камерах, освещении и прочем.
Теперь приступим к созданию проходов отрисовки, а к текущему классу будем возвращаться после реализации каждого из них.
Render Objects Pass
Задача этого прохода — отрисовывать объекты из определенного слоя с заменой материала в глобальное свойство-текстуру шейдера. Это будет упрощенная версия имеющегося в Universal RP прохода RenderObjectsPass, с единственным отличием в цели ( RenderTarget ), куда будет производится отрисовка.
Создадим класс MyRenderObjectsPass, наследуемый от ScriptableRenderPass. Реализуем метод Execute(), который будет содержать всю логику работы прохода, а так же переопределим метод Configure().
Метод Configure() используется для указания цели рендеринга и создания временных текстур. По умолчанию целью является цель текущей камеры и после выполнения прохода она вновь будет указана по умолчанию. Вызов этого метода осуществляется перед выполнение основой логики прохода.
Замена цели рендеринга
Объявим RenderTargetHandle для новой цели рендеринга. Используя его, создадим временную текстуру и укажем её как цель. RenderTargetHandle содержит в себе идентификатор используемой временной RenderTexture. А также позволяет получить RenderTargetIdentifier, служащий для идентификации цели рендеринга, которая может быть задана, например как объект RenderTexture, Texture, временная RenderTexture или встроенная (используется камерой при отрисовке кадра).
Объект RenderTargetHandle будет создаваться в OutlineFeature и передаваться нашему проходу при его создании.
Метод GetTemporaryRT() создаёт временную RenderTexture с заданными параметрами и устанавливает её как глобальное свойство шейдера с указанным именем (имя будет задаваться в фиче).
Для создания временной RenderTexture используем дескриптор текущей камеры, содержащий информацию о размере, формате и прочих параметрах цели камеры.
Указание цели и её очистка должны происходить только в Configure() с использованием методов ConfigureTarget() и ClearTarget().
Рендер
Подробно рассматривать отрисовку не будем, т.к. это может увести нас далеко и надолго от основной темы. Для отрисовки воспользуемся методом ScriptableRenderContext.DrawRenderers(). Создадим настройки для отрисовки только непрозрачных объектов только из указанных слоёв. Маску слоя будем передавать в конструктор.
Замена материала
Переопределим используемые материалы при отрисовке, так как нам нужны только контуры объектов.
Шейдер для отрисовки
Создадим в ShaderGraph шейдер материала, который будет использоваться при отрисовке объектов в текущем проходе.
Добавляем проход в OutlineFeature
Вернемся в OutlieFeature. Для начала создадим класс для настроек нашего прохода.
Объявим поля для настроек MyRenderPass и имени глобального свойства-текстуры, используемой в качестве цели рендеринга нашим проходом.
Создадим идентификатор для свойства-текстуры и экземпляр MyRenderPass.
В методе AddRendererPass добавляем наш проход в очередь на исполнение.
Результат прохода для исходной сцены должен получиться следующий:
Blur Pass
Цель этого прохода — размыть изображение, полученное на предыдущем шаге и установить его в глобальное свойство шейдера.
Для этого несколько раз будем копировать исходную текстуру во временные, с применением к ней шейдера размытия. При этом исходное изображение можно уменьшить в размерах (создать уменьшенную копию), что ускорит расчеты и не повлияет на качестве результата.
Создадим класс BlurPass, наследуемый от ScriptableRenderPass.
Заведём переменные под исходную, целевую и временные текстуры (и их ID).
Все ID для RenderTexture задаются через Shader.PropertyID(). Это не означает что где-то обязательно должны существовать такие свойства шейдера.
Добавим поля и под остальные параметры, которые сразу же инициализируем в конструкторе.
_blurMaterial — материал с шейдером размытия.
_downSample — коэффициент для уменьшения размера текстуры
_passesCount — количество проходов размытия, которое будет применено.
Для создания временных текстур создадим дескриптор со всей необходимой информацией о ней — размере, формате и прочем. Высоту и размер будем масштабировать относительно дескриптора камеры.
Также создадим идентификаторы и сами временные RenderTexture.
Мы снова меняем цель рендеринга, поэтому создадим ещё одну временную текстуру и укажем её как цель.
Размытие
Некоторые задачи рендеринга могут быть выполнены с помощью специальных методов ScriptableRenderContext, которые настраивают и добавляют в него команды. Для выполнения других команд потребуется использовать CommandBuffer, который можно получить из пула.
После добавления команд и отправки их на выполнение контексту, буфер нужно будет вернуть обратно в пул.
Конечная реализация метода Execute() будет следующей.
Шейдер
Для размытия создадим простой шейдер, который будет вычислять цвет пикселя с учётом его ближайших соседей ( среднее значение цвета пяти пикселей ).
Shader «Custom/Blur»
<
Properties
<
_MainTex («Texture», 2D) = «white» <>
>
struct Attributes
<
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
>;
struct Varyings
<
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
>;
TEXTURE2D_X(_MainTex);
SAMPLER(sampler_MainTex);
float4 _MainTex_TexelSize;
Varyings Vert(Attributes input)
<
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
return output;
>
half4 Frag(Varyings input) : SV_Target
<
float2 offset = _MainTex_TexelSize.xy;
float2 uv = UnityStereoTransformScreenSpaceTex(input.uv);
half4 color = SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, input.uv);
color += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, input.uv + float2(-1, 1) * offset);
color += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, input.uv + float2( 1, 1) * offset);
color += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, input.uv + float2( 1,-1) * offset);
color += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, input.uv + float2(-1,-1) * offset);
#pragma vertex Vert
#pragma fragment Frag
Добавляем проход в OutlineFeature
Порядок действия будет аналогичен добавлению нашего первого прохода. Сначала создадим настройки.
И добавим в очередь на выполнение.
Outline Pass
Конечное изображение с обводкой объектов будет получено с помощью шейдера. И результат его работы будет отображаться поверх текущего изображения на экране.
Ниже представлен сразу весь код прохода, т.к. вся логика заключена в двух строках.
RenderingUtils.fullscreenMesh возвращает меш размером 1 на 1.
Шейдер
Создадим шейдер для получения контура. Он должен содержать два глобальных свойства-текстуры. _OutlineRenderTexture и _OutlineBluredTexture для изображения указанных объектов и его размытого варианта.
Результат работы шейдера для для двух полученных ранее изображений:
Добавляем проход в OutlineFeature
Все действия аналогичны предыдущим проходам.
RenderPassEvent
Осталось указать когда будут вызываться созданные проходы. Для этого каждому из них нужно указать параметр renderPassEvent.
Создадим соответствующее поле в OutlineFeature.
И укажем его всем созданным проходам.
Настройка
Добавим слой Outline и установим его для объектов, которые хотим обвести.
Создадим и настроим все необходимые ассеты: UniversalRendererPipelineAsset и ForwardRendererData.
Результат
Результат для нашего исходного кадра будет следующим!
Доработка
Сейчас обводка объекта будет видна всегда, даже через другие объекты. Чтобы наш эффект учитывал глубину сцены нужно внести несколько изменений.
RenderObjectsPass
Указывая цель нашего рендера, мы должны также указать текущий буфер глубины. Создадим соответствующее поле и метод.
В методе Configure() укажем глубину в настройке цели рендера.
OutlineFeature
В OutlineFeature передадим MyRenderObjectsPass текущую глубину сцены.
UniversalRenderPipelineAsset
В используемом UniversalRenderPipelineAsset поставим галочку напротив пункта DepthTexture.
Результат
Результат без учета глубины:
Результат с учетом глубины:
ScriptableRendererFeature достаточно удобный инструмент для добавления своих проходов в RP.
В нем можно легко заменять RenderObjectsPass’ы и использовать их в других ScriptableRendererFeature. Не нужно сильно углубляться в реализацию Universal RP и менять его код, чтобы что-то добавить.
Для того чтобы общий алгоритм работы со ScriptableRendererFeature и ScriptableRenderPass был более понятен, и чтобы статья не сильно разрослась, я намеренно старался создавать код проходов простым, пусть даже в ущерб их универсальности и оптимальности.
Ссылки
Исходный код — ссылка на gitlab
Модели и сцена взяты из игры Lander Missions: planet depths
За основу примера была взята следующая реализация обводки — ссылка на youtube
Примеры реализации собственных RenderFeature от Unity — ссылка на github.
Серия уроков по созданию собственного ScriptableRenderPipeline. После прочтения становится ясна общая логика работы RP и шейдеров — ссылка на туториалы.