Рендеринг и материалы
Рендеринг в Unreal Engine 5 — материалы и инстансы, поток рендеринга, компиляция шейдеров, Nanite, Lumen, RHI и профилирование GPU.
13 вопросов
JuniorКодОчень частоКак изменить цвет материала на меше во время выполнения в Unreal Engine?
Как изменить цвет материала на меше во время выполнения в Unreal Engine?
Создайте UMaterialInstanceDynamic через CreateDynamicMaterialInstance на компоненте, затем вызовите SetVectorParameterValue с именованным параметром. Прямая правка ассета базового материала затронула бы каждый меш с ним.
Типичные ошибки
- ✗Править общий ассет базового материала, что меняет цвет на каждом меше с ним
- ✗Забывать, что материал должен иметь именованный векторный параметр, чтобы вызов сработал
- ✗Создавать новый динамический инстанс каждый кадр вместо кэширования и переиспользования одного
Уточняющие вопросы
- →Когда создавать динамический инстанс материала — в
BeginPlayили по требованию? - →Чем
SetScalarParameterValueотличается отSetVectorParameterValue?
JuniorТеорияОчень частоВ чём разница между материалом и инстансом материала в Unreal Engine?
В чём разница между материалом и инстансом материала в Unreal Engine?
Материал задаёт граф шейдера и компилируется в код шейдера. Инстанс материала переиспользует этот скомпилированный шейдер и переопределяет только открытые параметры, поэтому правка инстанса никогда не вызывает перекомпиляцию.
Типичные ошибки
- ✗Думать, что правка инстанса материала перекомпилирует шейдер — она лишь подменяет значения параметров
- ✗Считать, что инстансы рендерятся быстрее родителя — они используют тот же шейдер
- ✗Полагать, что инстанс может перестроить граф шейдера, а не только переопределить параметры
Уточняющие вопросы
- →В чём разница между material instance constant и material instance dynamic?
- →Почему слишком много перестановок static switch вредит времени сборки и загрузки?
JuniorТеорияОчень частоКаковы основные стадии конвейера рендеринга кадра в Unreal?
Каковы основные стадии конвейера рендеринга кадра в Unreal?
Кадр проходит отсечение видимости, затем depth pre-pass, base pass, заполняющий G-buffer, освещение и тени, полупрозрачность и, наконец, постобработку. Поток рендеринга собирает эти проходы в команды GPU, пока игровой поток работает на кадр впереди.
Типичные ошибки
- ✗Думать, что кадр рисуется одним проходом, а не последовательностью depth, base, освещения и post
- ✗Считать, что рендерер работает на игровом потоке, а не на параллельном потоке рендеринга
- ✗Путать base pass (заполняет G-buffer) с проходом освещения, который его потребляет
Уточняющие вопросы
- →Почему Unreal выполняет depth pre-pass до base pass?
- →Как игровой поток и поток рендеринга держатся на расстоянии в один кадр?
MiddleДебаггингЧастоКак отлаживать материал, который подозревается в просадке производительности рендеринга?
Как отлаживать материал, который подозревается в просадке производительности рендеринга?
Откройте панель статистики материала, чтобы увидеть число инструкций и сэмплеров текстур, затем используйте viewmode Shader Complexity для оценки овердрова и цены на экране. Профилируйте кадр через ProfileGPU, чтобы подтвердить, что виноват base pass. Здесь 412 инструкций base pass против обычных 100–200 и 13/16 сэмплеров показывают, что дорог сам материал, а красные стены — это цена шейдера на пиксель на большой площади экрана, а не число вызовов отрисовки.
Типичные ошибки
- ✗Читать
Shader Complexityкак числовызовов отрисовки, а не цену шейдера на пиксель - ✗Игнорировать число инструкций и сэмплеров в панели статистики материала
- ✗Оптимизировать материал до того, как
ProfileGPUподтвердит, что узкое место — base pass
Уточняющие вопросы
- →Почему полупрозрачный материал ухудшает показания viewmode
Shader Complexity? - →Как перевод узлов в static switch снижает число инструкций материала в рантайме?
MiddleТеорияЧастоКак профилировать производительность GPU в проекте на Unreal Engine?
Как профилировать производительность GPU в проекте на Unreal Engine?
Начните со stat unit, чтобы подтвердить, что GPU — узкое место, затем используйте ProfileGPU или Unreal Insights для таймингов по проходам. Инструменты вроде RenderDoc захватывают кадр для покадрового анализа на уровне вызовов отрисовки.
Типичные ошибки
- ✗Оптимизировать GPU до того, как
stat unitподтвердит, что узкое место — он, а не CPU - ✗Полагаться на голый FPS вместо разбивки по проходам или отрисовкам
- ✗Полагать, что профилирование GPU требует shipping-сборки — редактор даёт
ProfileGPU
Уточняющие вопросы
- →Что сообщают строки Game, Draw и GPU в
stat unitпо отдельности? - →Как захват RenderDoc помогает диагностировать конкретный дорогой
вызов отрисовки?
MiddleТеорияЧастоЧто такое отложенное затенение и G-buffer в Unreal?
Что такое отложенное затенение и G-buffer в Unreal?
Отложенное затенение разделяет геометрию и освещение. Base pass пишет данные поверхности — albedo, нормали, roughness — в render-таргеты G-buffer; поздний проход освещения читает их и затеняет каждый пиксель раз на источник, поэтому цена растёт с числом источников света.
Типичные ошибки
- ✗Думать, что base pass вычисляет итоговое освещение, а не просто пишет атрибуты поверхности
- ✗Забывать, что G-buffer — это несколько render-таргетов, а не один буфер
- ✗Полагать, что отложенное затенение обрабатывает полупрозрачность — ей нужен отдельный forward-путь
Уточняющие вопросы
- →Почему отложенному затенению трудно с полупрозрачными материалами?
- →Как «толстый» G-buffer влияет на пропускную способность памяти на слабых GPU?
MiddleТеорияЧастоЧто такое конвейер постобработки и сколько он стоит?
Что такое конвейер постобработки и сколько он стоит?
Постобработка выполняет полноэкранные проходы после затенения сцены — tone mapping, bloom, глубину резкости, сглаживание. Каждый проход сэмплирует весь render-таргет, поэтому цена растёт с разрешением экрана, а не со сложностью сцены; PostProcessVolume управляет тем, какие проходы идут.
Типичные ошибки
- ✗Полагать, что цена постобработки растёт с геометрией сцены, а не с разрешением экрана
- ✗Оставлять дорогие проходы вроде bloom или DOF включёнными в PostProcessVolume без нужды
- ✗Думать, что постобработка идёт на CPU, а не как полноэкранные проходы GPU
Уточняющие вопросы
- →Почему временному сглаживанию нужны векторы движения из ранних проходов?
- →Как бы вы профилировали, какой проход постобработки доминирует в кадре?
MiddleТеорияЧастоВ чём разница между потоком рендеринга и игровым потоком в Unreal Engine?
В чём разница между потоком рендеринга и игровым потоком в Unreal Engine?
Игровой поток выполняет геймплей, тики и физику; поток рендеринга переводит сцену в команды GPU. Они работают параллельно со сдвигом в один кадр, общаясь через очередь render-команд, а не через прямой общий доступ.
Типичные ошибки
- ✗Думать, что два потока работают последовательно, а не параллельно со сдвигом в кадр
- ✗Обращаться к состоянию actor-
UObjectнапрямую изпотока рендерингавместо постановки данных в очередь - ✗Путать
поток рендеринга(CPU) с самим GPU
Уточняющие вопросы
- →Что такое render-команда и как работает
ENQUEUE_RENDER_COMMAND? - →Как задержка в один кадр между потоками влияет на отзывчивость ввода?
MiddleТеорияЧастоКакова стоимость производительности полупрозрачных материалов по сравнению с непрозрачными?
Какова стоимость производительности полупрозрачных материалов по сравнению с непрозрачными?
Полупрозрачность пропускает depth pre-pass, поэтому не отсекается ранним Z-тестом и страдает от овердрова. Она затеняется в forward-режиме с ограниченным освещением, а её цена растёт с числом наложенных слоёв и покрытием экрана.
Типичные ошибки
- ✗Полагать, что полупрозрачность пишет глубину и отсекается ранним Z, как непрозрачная геометрия
- ✗Игнорировать овердров — наложенные прозрачные слои затеняют одни и те же пиксели много раз
- ✗Ожидать полного deferred-освещения на полупрозрачных поверхностях вместо ограниченного forward
Уточняющие вопросы
- →Как настройка translucency sort priority помогает с артефактами порядка отрисовки?
- →Когда стоит использовать masked-материал вместо полупрозрачного?
MiddleТеорияИногдаЧто такое Lumen в Unreal Engine 5 и какую задачу он решает?
Что такое Lumen в Unreal Engine 5 и какую задачу он решает?
Lumen — система динамического глобального освещения и отражений UE5 в реальном времени. Она убирает запечённые lightmap'ы: отражённый свет обновляется при движении источников и геометрии, а бэкендом служит software- или hardware-трассировка.
Типичные ошибки
- ✗Путать Lumen (глобальное освещение) с Nanite (виртуализированная геометрия)
- ✗Думать, что Lumen запекает освещение офлайн — он полностью реального времени и динамичен
- ✗Полагать, что Lumen требует hardware-трассировку лучей — у него есть software-путь
Уточняющие вопросы
- →Когда запечённые lightmap'ы всё ещё выгоднее Lumen для релизного проекта?
- →В чём компромисс производительности между software- и hardware-путями трассировки Lumen?
MiddleТеорияИногдаДля чего хорош Nanite в Unreal Engine 5 и где он не идеален?
Для чего хорош Nanite в Unreal Engine 5 и где он не идеален?
Nanite — виртуализированная геометрия: он стримит и LOD'ит плотные статические меши покластерно, убирая ручные LOD и число вызовов отрисовки как узкое место. Он слаб на скелетных мешах, masked-материалах и очень мелких треугольниках.
Типичные ошибки
- ✗Путать Nanite (виртуализированная геометрия) с Lumen (глобальное освещение)
- ✗Ожидать, что Nanite хорошо справится со скелетными мешами или полупрозрачными материалами
- ✗Считать меши с крохотными треугольниками сильным кейсом для Nanite — они снижают его эффективность
Уточняющие вопросы
- →Почему множество крохотных треугольников снижают покластерную эффективность Nanite?
- →Как Nanite меняет важность ручной батч-группировки
вызовов отрисовки?
MiddleТеорияИногдаЧто вызывает заикания из-за компиляции шейдеров и как их смягчить?
Что вызывает заикания из-за компиляции шейдеров и как их смягчить?
Новая перестановка шейдера попадает на GPU до компиляции своего pipeline state object, останавливая кадр. Смягчение — PSO precaching или кэш PSO, собранный с прохождений, чтобы конвейеры были готовы до первой отрисовки.
Типичные ошибки
- ✗Винить стриминг текстур или скорость диска в том, что на деле компиляция pipeline state
- ✗Полагать, что shipping-сборки не компилируют шейдеры в рантайме — создание PSO всё равно происходит
- ✗Думать, что высокий лимит кадров скрывает остановку, вместо предкэширования конвейера
Уточняющие вопросы
- →Что такое pipeline state object и почему его создание дорого?
- →Чем встроенный кэш PSO отличается от рантайм-предкэширования PSO?
SeniorТеорияРедкоЧто такое RHI (Render Hardware Interface) в Unreal Engine на высоком уровне?
Что такое RHI (Render Hardware Interface) в Unreal Engine на высоком уровне?
RHI — слой абстракции Unreal над графическими API. Код рендерера выдаёт платформонезависимые RHI-команды, а бэкенд под каждую платформу (D3D12, Vulkan, Metal) их транслирует, поэтому рендерер остаётся независимым от API.
Типичные ошибки
- ✗Путать RHI с драйвером GPU — он находится над драйвером, а не под ним
- ✗Думать, что код рендерера вызывает
D3D12илиVulkanнапрямую, а не через RHI - ✗Считать RHI форматом данных, а не слоем абстракции команд
Уточняющие вопросы
- →Как RHI-поток соотносится с
потоком рендеринга? - →Почему слой абстракции вроде RHI несёт измеримую цену в рантайме?