Похожие презентации:
4_Основы физического моделирования
1.
Рендеринг и графическийконвейер
2.
Содержаниелекции
1
Введение
2
Рендеринг и графический конвейер
3
Освещение
4
Система частиц
5
Графика
6
Инструменты оптимизации
1
3.
1Рендеринг и графический конвейер
Рендеринг в Unity — это
процесс преобразования 3Dмоделей, текстур, материалов и
освещения в 2D-изображение на
экране.
В Unity 6 разработчик выбирает рендер-пайплайн заранее. Конвейер организует задачи
рендеринга в логические этапы, которые обычно включают отсечение (определение,
какие объекты видимы), расчёт теней, рендеринг непрозрачной геометрии, обработку
прозрачных объектов, применение эффектов постобработки и, наконец, представление
завершённого кадра на дисплее.
Графический конвейер
(конвейер рендеринга) — это
последовательность операций,
которые графический движок
выполняет для преобразования
данных 3D-сцены в финальный
кадр.
2
4.
2Какие рендер-пайплайны есть в Unity 6?
В Unity доступны встроенный и
скриптуемый графические
конвейеры. Разработчики могут
реализовать свои собственные
конвейеры рендеринга с нуля,
используя API C#,
предоставляемые Unity в рамках
SRP Framework.
Unity 6 предоставляет три предустановленных пайплайна.
• URP — настраиваемый Scriptable Render Pipeline для широкого диапазона платформ,
от мобильных устройств до ПК и консолей.
• HDRP предназначен для высокодетализированной графики на мощном железе.
• Built-In Render Pipeline остаётся универсальным, но имеет более ограниченные
возможности кастомизации.
3
5.
2Встроенный (Built-in)
Стандартный и устаревший
метод рендеринга. Не очень
настраиваемый (система «чёрного
ящика»). Подходит для небольших
проектов или обратной
совместимости.
• использует прямые или отложенные пути рендеринга;
• имеет ограниченные функции скриптуемого конвейера, например, размещение
камер или управление освещением для каждого объекта.
4
6.
2Скриптуемый (Scriptable)
Позволяет разработчикам
определять пользовательские
процессы рендеринга с
помощью C#.
Универсальный конвейер рендеринга (URP) (ранее назывался Lightweight RP
(LWRP)). Оптимизирован для повышения производительности на разных платформах,
включая мобильные устройства, виртуальную реальность и веб. Особенности:
поддержка шейдерного графика, средство прямой визуализации (с необязательной
отсрочкой в более новых версиях), облегчённое освещение, постобработка и
компоновка камер.
5
7.
2Скриптуемый (Scriptable)
Позволяет разработчикам
определять пользовательские
процессы рендеринга с
помощью C#.
Конвейер
рендеринга
высокой
чёткости
(HDRP).
Ориентирован
на
высокопроизводительные платформы (ПК, консоли). Особенности: рендеринг на
физической основе (PBR), реалистичное освещение, объёмность, отражения, поддержка
трассировки лучей (DXR), расширенные эффекты, такие как подповерхностное
рассеяние, системы деколей.
6
8.
2Скриптуемый (Scriptable)
Можно создать несколько
ресурсов конвейера
рендеринга с разными
конфигурациями, например, для
разных уровней качества
оборудования.
Чтобы указать, какой скрипттуемый конвейер использует Unity, используются ресурсы
Render Pipeline. Актив конвейера рендеринга сообщает Unity, какой SRP использовать и
как его настроить. Если не указать актив, Unity использует встроенный конвейер
рендеринга.
ScriptableRenderContext — это класс, выступающий в качестве интерфейса
между
пользовательским
кодом
C#
в
конвейере
рендеринга
и
низкоуровневым графическим кодом Unity.
• RenderPipeline.Render — это основная точка входа в SRP. Unity вызывает этот метод
автоматически. Если вы пишете собственный конвейер рендеринга, здесь вы
начинаете писать свой код.
• Класс RenderPipelineManager содержит следующие события, на которые вы можете
подписаться, чтобы выполнять пользовательский код в определенных точках цикла
рендеринга:
⚬ beginFrameRendering
⚬ beginCameraRendering
⚬ endCameraRendering
⚬ endFrameRendering
7
9.
3Отличия 2D от 3D-пайплайна
В Unity 2D-проект ориентирован на следующие элементы:
• Спрайты: Основной графический элемент.
• Тайлмапы: Используются для создания окружения.
• 2D-физика: Определяет взаимодействие объектов.
В 3D-проекте акцент делается на:
• Меши: Основные геометрические формы.
• Материалы и нормали: Определяют внешний вид поверхности.
• Объёмный свет и пространственная глубина: Обеспечивают
реалистичное освещение.
В Universal Render Pipeline (URP) есть отдельный 2D Renderer asset
для 2D, включающий:
• 2D Light-компоненты: Для освещения сцен.
• Shader Graph sub-targets: Специальные цели для шейдеров.
• 2D render pass: Специальный рендер-проход.
2D и 3D в Unity представляют собой не просто разные
камеры, а принципиально разные организационные модели
рендеринга. В 3D важны геометрия, тени, нормали и объём света.
В 2D ключевыми являются порядок наложения, читаемость
силуэтов, работа со спрайтами и специальным 2D-светом.
8
10.
4Как формируется кадр?
Кадр начинается на стороне CPU: движок обновляет сцену, анимацию, физику, трансформации объектов, собирает видимые
элементы и подготавливает команды рендеринга. Затем Unity отправляет на GPU draw calls и команды переключения состояний,
включая выбор шейдерных проходов. В окне Profiler модуль Rendering показывает, в частности, Batches Count и SetPass Calls Count:
первое отражает количество команд рисования, второе — сколько раз Unity переключала шейдерный pass. Именно здесь часто
видно, упирается ли проект в избыточное число объектов, материалов или состояний рендера.
9
11.
5Схема графического конвейера
1.Сцена проходит этап отбора видимых
объектов.
2.Вершины обрабатываются с помощью
vertex shader.
3.Треугольники растеризуются в пиксели.
4.Fragment shader вычисляет итоговый
цвет каждого фрагмента.
5.После основного рендера к кадру могут
применяться полноэкранные эффекты:
⚬ bloom
⚬ vignette
⚬ color grading
⚬ depth of field
⚬ и другие.
6.Каждая стадия имеет собственную
цену:
⚬ Геометрия и число объектов
сильнее влияют на CPU и vertex
stage.
Прозрачность, overdraw и дорогие
материалы влияют на fragment stage и GPU
fill rate.
10
12.
6Вершинный шейдер
Vertex shader запускается для
каждой вершины модели. Его
типичная задача — перевести
координаты из object space в clip
space, а также передать дальше
данные, нужные для пиксельных
вычислений: UV, нормали, цвет
вершины, мировую позицию,
маски и другие параметры.
На этом этапе удобно делать безопасные и недорогие деформации геометрии: лёгкое
покачивание флага, волну на ткани, смещение травы, анимацию поверхности по
времени. Важно помнить, что вершинный шейдер работает, как не удивительно, только
по вершинам: если сетка грубая, плавной деформации не получится.
11
13.
7Фрагментный шейдер
Fragment shader работает уже
не с вершинами, а с фрагментами,
то есть с потенциальными
пикселями кадра. Именно здесь
обычно считается цвет материала,
смешиваются текстуры,
применяются маски, нормали,
освещение, прозрачность и
эмиссия.
Если проект страдает от просадки GPU, именно этап обработки
фрагментов (fragment stage) часто оказывается узким местом: дорогие
прозрачные материалы, большое количество наложенных UI-слоёв,
частиц и полноэкранных эффектов быстро упирают проект в fill rate
(скорость заполнения экрана пикселями). Поэтому визуальная красота
почти всегда оплачивается количеством вычислений на пиксель.
12
14.
6Пример URP-шейдера
Здесь хорошо видно две ключевые точки: #pragma
vertex vert и #pragma fragment frag. Вершинная
функция переводит координаты объекта в экранное
пространство, а фрагментная возвращает единый
цвет.
Shader "Custom/URPColorTint"
{
Properties
{
_BaseColor ("Base Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
half4 _BaseColor;
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
return _BaseColor;
}
ENDHLSL
13
}
15.
6Прямой свет, непрямой свет, baked и mixed
Освещение в Unity нужно
понимать как сочетание
прямого (direct) и непрямого
(indirect) света. Система
глобального освещения (Global
Illumination) моделирует как
прямое попадание света, так и
отражённый свет от поверхностей.
По режимам работы чаще всего различают Baked, Realtime и Mixed освещение.
Baked-свет считается заранее и не даёт runtime-накладных расходов на сам свет, зато
требует подготовки данных.
Mixed-свет совмещает запечённые и real-time особенности, например baked indirect
lighting и real-time direct lighting.
Для подвижных объектов важны Light Probes: они дают качественное освещение
движущихся объектов и также используются для освещения статических LOD-уровней.
14
16.
6Пример освещения сцены
15
17.
6Rendering Paths
В Unity URP есть несколько
способов рисовать сцену. Они
отличаются тем, как именно
движок считает освещение.
Forward: объект рисуется, и свет для него считается сразу.
Forward+ работает похоже, но лучше подходит для сцен, где много источников света,
потому что умеет учитывать больше ламп и подсветок без жёстких ограничений на
объект.
16
18.
6Rendering Paths
В Unity URP есть несколько
способов рисовать сцену. Они
отличаются тем, как именно
движок считает освещение.
Deferred работает по-другому: сначала Unity собирает информацию о поверхности
объектов, а уже потом отдельным этапом считает освещение.
Deferred+ — это более современная версия такого подхода. Она тоже сначала
собирает данные о сцене, а потом считает свет, но лучше справляется со сложными
сценами и использует улучшенную обработку света там, где обычный Deferred уже не
так удобен.
17
19.
6Постобработка
Постобработка применяется уже к
готовому изображению и меняет
его как целый экранный буфер.
Это не замена хорошему свету и
материалам, а этап финальной
художественной сборки
кадра. С её помощью
имитируются физические и
киношные свойства изображения,
например bloom и depth of field.
В Unity важно помнить, что
постобработка зависит от
выбранного render pipeline:
решения одного пайплайна не
совместимы с другим. В URP
постобработка встроена в сам
пайплайн, а в Built-In по
умолчанию такого встроенного
решения нет.
18
20.
6Как включить постобработку?
В Unity 6 новая URP-сцена не использует постобработку по умолчанию, если
только вы не взяли шаблон или пример, где она уже включена. Базовая
последовательность такая: выбрать Camera и включить у неё Post Processing,
затем добавить в сцену объект с компонентом Volume, чаще всего Global
Volume, создать для него Volume Profile, после этого через Add Override
добавить нужные эффекты — свечение (Bloom), цветокоррекция (Color
Adjustments), виньетирование (Vignette) или глубина резкости (Depth of Field)
19
21.
6Particle System и VFX Graph
Для визуальных эффектов в Unity
есть как минимум два больших
инструмента. Particle System
подходит для огня, дыма, пыли,
искр, жидкости и других
динамических явлений, когда
эффект строится из множества
мелких графических элементов.
Visual Effect Graph нужен там,
где требуется большое количество
частиц и очень настраиваемое
поведение; он симулирует
поведение частиц на GPU и
поэтому способен обрабатывать
значительно больший масштаб
эффекта, чем встроенная система
частиц. Практически это означает
следующее: небольшие локальные
эффекты удобно делать на Particle
System, а крупные, насыщенные и
тяжёлые GPU-эффекты —
переносить в VFX Graph.
20
22.
6Пример простой Particle System
21
23.
6Уровни детализации, или Level of Details
LOD — это система уровней
детализации, при которой у
объекта есть несколько версий
модели: от детальной до
упрощённой. Unity управляет
переключением через компонент
LOD Group.
Граница перехода задаётся как процент от высоты объекта на экране: например,
значение 50% означает, что данный LOD активен, когда объект занимает примерно
половину высоты окна камеры. Для мягких переходов Unity позволяет включать crossfading. Практически это один из самых надёжных способов снять нагрузку с GPU в
больших 3D-сценах.
22
24.
6Оптимизация CPU и GPU
Оптимизацию всегда нужно
начинать с ответа на вопрос:
кто ограничивает кадр — CPU
или GPU?
Если страдает CPU, чаще всего виноваты число объектов, draw calls, частые
переключения состояний, лишние источники света и отсутствие батчинга. Здесь
помогают уменьшение количества видимых объектов, более жёсткое отсечение
невидимых объектов (culling), baked lighting, снижение числа попиксельных источников
света в реальном времени (real-time per-pixel lights), а также пакетирование команд. Для
URP полезен SRP Batcher, который уменьшает число переключений render state между
draw calls.
23
25.
6Оптимизация CPU и GPU
Оптимизацию всегда нужно
начинать с ответа на вопрос:
кто ограничивает кадр — CPU
или GPU?
Если ограничение на стороне GPU, нужно смотреть на overdraw, стоимость
фрагментного шейдера, прозрачность, тени, разрешение рендера и полноэкранные
эффекты. Unity рекомендует сокращать перекрывающиеся прозрачные элементы,
упрощать фрагментные шейдеры, при необходимости использовать упрощённые
материалы, динамическое изменение разрешения и компрессию текстур. В URP также
есть GPU occlusion culling, где Unity использует GPU вместо CPU для отсечения
скрытых объектов; это полезно в сценах с сильной окклюзией, но даёт выигрыш не
всегда и само по себе добавляет работу GPU.
24
26.
6Компромисс между качеством
и скоростью
В реальном проекте оптимизация почти всегда означает
управляемый обмен качества на скорость.
• Самые дорогие и чувствительные к настройке зоны:
⚬ тени в реальном времени,
⚬ число активных источников света,
⚬ прозрачные материалы,
⚬ разрешение рендера,
⚬ глубина постобработки,
⚬ стоимость шейдеров на пиксель.
• Хорошая стратегия — не отключать всё подряд, а выстраивать
иерархию важности:
⚬ что влияет на геймплей и читаемость,
что является только декоративным слоем.
25
27.
6Как профилировать рендеринг?
1.Главные инструменты анализа — Profiler, Frame
Debugger и RenderDoc.
2.В Profiler, модуль Rendering, удобно смотреть Draw
Calls, SetPass Calls и общую структуру рендеринга
кадра.
3.Из Profiler можно открыть Frame Debugger, который
замораживает кадр и позволяет пошагово изучать
отдельные draw calls и то, как именно собирается
изображение.
4.Если нужен более глубокий разбор конкретного GPUкадра, Unity 6 поддерживает интеграцию с RenderDoc
прямо из редактора: можно захватить следующий
кадр и разбирать проходы, ресурсы и поведение
шейдеров.
5.Практический рабочий цикл такой:
⚬ Сначала понять, упирается ли проект в
центральный процессор (CPU-bound) или в
графический процессор (GPU-bound).
⚬ Затем подтвердить это в Profiler.
⚬ После этого локализовать проблему в Frame
Debugger.
Для сложных GPU-случаев завершить анализ в
RenderDoc.
26