Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Создание простого цикла рендеринга в пользовательском конвейере рендеринга

Цикл рендеринга — это термин, обозначающий весь рендерингпроцесс вывода графики на экран (или в текстура). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь
операции, происходящие в одном кадре. На этой странице содержится информация о создании простого цикла рендеринга в пользовательском конвейере рендеринга, основанном на Scriptable Render Pipeline Unity.

Примеры кода на этой странице демонстрируют основные принципы использования Scriptable Render Pipeline. Вы можете использовать эту информацию для создания собственного конвейера рендеринга с поддержкой сценариев или для понимания того, как работают готовые конвейеры рендеринга с поддержкой сценариев Unity.

Подготовка вашего проекта

Прежде чем вы начнете писать код для цикла рендеринга, вы должны подготовить свой проект.

Эти шаги следующие:

  1. Создайте шейдер, совместимый с SRP.
  2. Создайте один или несколько игровых объектов для рендеринга.
  3. Создайте базовую структуру пользовательской SRP.
  4. Необязательно: если вы планируете расширить свой простой пользовательский SRP, чтобы добавить более сложные функции, установите пакет SRP Core. Пакет SRP Core включает программу SRP Core shader, которая работает на графическом процессоре. Подробнее
    См. в библиотеке Словарь
    (которую можно использовать, чтобы сделать ваши шейдеры совместимыми с SRP Batcher ) и служебные функции для общих операций. Дополнительные сведения см. в документации по пакету SRP Core.

Создание шейдера, совместимого с SRP

В Scriptable Render Pipeline вы используете тег LightMode Pass, чтобы определить, как рисовать геометрию. Дополнительную информацию о тегах прохода см. в разделе ShaderLab: назначение тегов проходу.

В этом задании показано, как создать очень простой неосвещенный объект Shader со значением тега LightMode Pass ExampleLightModeTag.

  1. Создайте новый ресурс шейдера в своем проекте. Инструкции по созданию объекта шейдера см. в разделе ресурсы шейдера.
  2. В представлении «Проект» дважды щелкните ресурс шейдера, чтобы открыть исходный код шейдера в текстовом редакторе.
  3. Замените существующий код следующим:
// This defines a simple unlit Shader object that is compatible with a custom Scriptable Render Pipeline. // It applies a hardcoded color, and demonstrates the use of the LightMode Pass tag. // It is not compatible with SRP Batcher. Shader "Examples/SimpleUnlitColor" { SubShader { Pass { // The value of the LightMode Pass tag must match the ShaderTagId in ScriptableRenderContext.DrawRenderers Tags { "LightMode" = "ExampleLightModeTag"} HLSLPROGRAM #pragma vertex vert #pragma fragment frag float4x4 unity_MatrixVP; float4x4 unity_ObjectToWorld; struct Attributes { float4 positionOS : POSITION; }; struct Varyings { float4 positionCS : SV_POSITION; }; Varyings vert (Attributes IN) { Varyings OUT; float4 worldPos = mul(unity_ObjectToWorld, IN.positionOS); OUT.positionCS = mul(unity_MatrixVP, worldPos); return OUT; } float4 frag (Varyings IN) : SV_TARGET { return float4(0.5,1,0.5,1); } ENDHLSL } } }

Создание GameObject для рендеринга

Чтобы проверить, работает ли ваш цикл рендеринга, вы должны создать что-то для рендеринга. В этом задании показано, как размещать GameObjectsосновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки. , и больше. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. Словарь
в вашем sceneСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотрите в Словарь
, где используется SRP-совместимый шейдер, созданный вами на предыдущем этапе. задача.

  1. Создайте новый материальный объект в своем проекте Unity. Инструкции см. в разделе МатериалыРесурс, определяющий способ визуализации поверхности. Подробнее
    См. в Словарь
    .
  2. Назначьте объект шейдера объекту материала. Инструкции см. в разделе Материалы.
  3. Создайте куб в своей сцене. Инструкции см. в разделе Примитивные объекты.
  4. Назначьте ему материал. Инструкции см. в разделе Материалы.

Создание базовой структуры индивидуального SRP

Заключительный этап подготовки – это создание основных исходных файлов, необходимых для вашего пользовательского SRP, и указание Unity начать рендеринг с использованием пользовательского SRP.

  1. Создайте класс, наследуемый от RenderPipeline, и совместимый актив конвейера рендеринга, следуя инструкциям в Создание экземпляра конвейера рендеринга и актива конвейера рендеринга
  2. Установите активный объект конвейера рендеринга, следуя инструкциям в разделе Настройка активного ресурса конвейера рендеринга. Unity немедленно начнет рендеринг с использованием пользовательского SRP, что означает, что ваш вид сценыинтерактивный вид мира, который вы создаете. Вы используете Scene View для выбора и размещения пейзажей, персонажей, камер, источников света и всех других типов игровых объектов. Подробнее
    См. в Словарь
    , и представление игры будет пустым, пока вы не добавите код в свой собственный Рекомендуемая розничная цена.

Создание цикла рендеринга

В простом цикле рендеринга основными операциями являются:

  • Очистка цели рендеринга, что означает удаление геометрии, нарисованной в последнем кадре.
  • Отсечение, что означает отфильтровывание геометрии, невидимой для класса CameraКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
    См. в Словарь
    .
  • Рисование, что означает указание графическому процессору, какую геометрию рисовать и как ее рисовать.

Очистка цели рендеринга

Очистка означает удаление объектов, нарисованных в последнем кадре. Целью рендеринга обычно является экран; однако вы также можете выполнить рендеринг в текстуры для создания эффекта «картинка в картинке». В этих примерах показано, как выполнять визуализацию на экране, что является поведением Unity по умолчанию.

Чтобы очистить цель рендеринга в Scriptable Render Pipeline, выполните следующие действия:

  1. Настройте CommandBuffer с помощью команды Clear.
  2. Добавьте CommandBuffer в очередь команд в ScriptableRenderContext; для этого вызовите ScriptableRenderContext.ExecuteCommandBuffer.
  3. Указание графическому API выполнять очередь команд в ScriptableRenderContext; для этого вызовите ScriptableRenderContext.Submit.

Как и во всех операциях Scriptable Render Pipeline, вы используете метод RenderPipeline.Render в качестве точки входа для этого кода. Этот пример кода демонстрирует, как это сделать:

/* This is a simplified example of a custom Scriptable Render Pipeline. It demonstrates how a basic render loop works. It shows the clearest workflow, rather than the most efficient runtime performance. */ using UnityEngine; using UnityEngine.Rendering; public class ExampleRenderPipeline : RenderPipeline { public ExampleRenderPipeline() { } protected override void Render (ScriptableRenderContext context, Camera[] cameras) { // Create and schedule a command to clear the current render target var cmd = new CommandBuffer(); cmd.ClearRenderTarget(true, true, Color.black); context.ExecuteCommandBuffer(cmd); cmd.Release(); // Instruct the graphics API to perform all scheduled commands context.Submit(); } }

Отбраковка

Отбраковка – это процесс отфильтровывания геометрии, невидимой для камеры.

Чтобы отсеять конвейер рендеринга с поддержкой сценариев, выполните следующие действия:

  1. Заполните структуру ScriptableCullingParameters данными о камере; для этого вызовите Camera.TryGetCullingParameters.
  2. Необязательно: вручную обновите значения структуры ScriptableCullingParameters.
  3. Вызовите ScriptableRenderContext.Cull и сохраните результаты в структуре CullingResults.

Этот пример кода расширяет приведенный выше пример и демонстрирует, как очистить цель рендеринга, а затем выполнить операцию отбраковки:

/* This is a simplified example of a custom Scriptable Render Pipeline. It demonstrates how a basic render loop works. It shows the clearest workflow, rather than the most efficient runtime performance. */ using UnityEngine; using UnityEngine.Rendering; public class ExampleRenderPipeline : RenderPipeline { public ExampleRenderPipeline() { } protected override void Render (ScriptableRenderContext context, Camera[] cameras) { // Create and schedule a command to clear the current render target var cmd = new CommandBuffer(); cmd.ClearRenderTarget(true, true, Color.black); context.ExecuteCommandBuffer(cmd); cmd.Release(); // Iterate over all Cameras foreach (Camera camera in cameras) { // Get the culling parameters from the current Camera camera.TryGetCullingParameters(out var cullingParameters); // Use the culling parameters to perform a cull operation, and store the results var cullingResults = context.Cull(ref cullingParameters); } // Instruct the graphics API to perform all scheduled commands context.Submit(); } }

Рисование

Рисование – это процесс, при котором API графики отрисовывается заданный набор геометрических фигур с заданными настройками.

Чтобы получить SRP, выполните следующие действия:

  1. Выполните операцию отбраковки, как описано выше, и сохраните результаты в структуре CullingResults.
  2. Создайте и настройте структуру FilteringSettings, которая описывает, как фильтровать результаты отбора.
  3. Создайте и настройте структуру DrawingSettings, которая описывает, какую геометрию рисовать и как ее рисовать.
  4. Необязательно: по умолчанию Unity устанавливает состояние рендеринга на основе объекта Shader. Если вы хотите переопределить состояние рендеринга для некоторой или всей геометрии, которую вы собираетесь рисовать, вы можете использовать для этого структуру RenderStateBlock. .
  5. Вызовите ScriptableRenderContext.DrawRenderers и передайте созданные вами структуры в качестве параметров. Unity рисует отфильтрованный набор геометрии в соответствии с настройками.

Этот пример кода основан на приведенных выше примерах и демонстрирует, как очистить цель рендеринга, выполнить операцию отбраковки и нарисовать результирующую геометрию:

/* This is a simplified example of a custom Scriptable Render Pipeline. It demonstrates how a basic render loop works. It shows the clearest workflow, rather than the most efficient runtime performance. */ using UnityEngine; using UnityEngine.Rendering; public class ExampleRenderPipeline : RenderPipeline { public ExampleRenderPipeline() { } protected override void Render (ScriptableRenderContext context, Camera[] cameras) { // Create and schedule a command to clear the current render target var cmd = new CommandBuffer(); cmd.ClearRenderTarget(true, true, Color.black); context.ExecuteCommandBuffer(cmd); cmd.Release(); // Iterate over all Cameras foreach (Camera camera in cameras) { // Get the culling parameters from the current Camera camera.TryGetCullingParameters(out var cullingParameters); // Use the culling parameters to perform a cull operation, and store the results var cullingResults = context.Cull(ref cullingParameters); // Update the value of built-in shader variables, based on the current Camera context.SetupCameraProperties(camera); // Tell Unity which geometry to draw, based on its LightMode Pass tag value ShaderTagId shaderTagId = new ShaderTagId("ExampleLightModeTag"); // Tell Unity how to sort the geometry, based on the current Camera var sortingSettings = new SortingSettings(camera); // Create a DrawingSettings struct that describes which geometry to draw and how to draw it DrawingSettings drawingSettings = new DrawingSettings(shaderTagId, sortingSettings); // Tell Unity how to filter the culling results, to further specify which geometry to draw // Use FilteringSettings.defaultValue to specify no filtering FilteringSettings filteringSettings = FilteringSettings.defaultValue; // Schedule a command to draw the geometry, based on the settings you have defined context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); // Schedule a command to draw the Skybox if required if (camera.clearFlags == CameraClearFlags.Skybox && RenderSettings.skybox != null) { context.DrawSkybox(camera); } // Instruct the graphics API to perform all scheduled commands context.Submit(); } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3