Files

80 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: render2d.PostProcess
search_names: [блум, свечение, ореол, эффекты камеры, постобработка]
title: Постобработка камеры
summary: Добавьте Bloom и цветовые эффекты камеры; проверьте экземпляры, типизированные параметры и ошибки назначения шейдера.
---
# Постобработка камеры
Запустите пример, переведите фокус в Game View и нажимайте пробел. Последовательно включаются Bloom, Color Grading, Vignette, Chromatic Aberration, Pixelate, CRT, пользовательский фильтр и исходное изображение. В примере есть линейная identity LUT и собственный материал. Изменённая насыщенность позволяет увидеть Color Grading даже с нейтральной LUT.
## Минимальная настройка камеры
Добавьте Post Process (`render2d.PostProcess`) на узел с [Camera2D](ref:engine.Camera2D). Включите компонент, добавьте один Bloom и включите этот экземпляр. Начните с непрозрачного вывода камеры и яркого спрайта. Понижайте Threshold до появления ореола вокруг яркой области, затем настройте Intensity и Radius. Выключите экземпляр для сравнения. Bloom размывает яркие пиксели готового изображения; для освещения соседних поверхностей нужен [Light2D](ref:engine.Light2D). Сам по себе Bloom не создаёт источник света.
Один логический выход камеры может занимать только один включённый стек. Если эффекта нет, проверьте выход камеры, Enabled компонента и экземпляра, порог и [PFX001](ref:PFX001). Для Custom нужен материал с postfx-шейдером; перед изменением назначения шейдера прочитайте [MAT004](ref:MAT004).
## Ореол вокруг лампы
Откройте основную сцену examples/platformer, выберите Camera и раскройте Post Process. У Bloom заданы Threshold 0,75, Intensity 0,22 и Radius 6. Понизьте порог, чтобы ореол появился вокруг большего числа ярких поверхностей. Увеличьте радиус, чтобы он стал шире. Сравните лампу и искры при включённом и выключенном стеке. Откройте настройки игры и проверьте чёткость текста. Для освещения соседних поверхностей у лампы есть Light2D.
Стек выполняется один раз после отрисовки мира всеми камерами одного выхода. Включите компонент на одной из них. Группа SceneLinear получает цвет до экспозиции и тональной компрессии. Группа DisplayLinear работает после них, до кодирования для вывода. Переставляйте эффекты внутри совместимой группы. Линейный offscreen-выход сохраняет значения сцены. Bloom и разделение цветовых каналов рассчитаны на непрозрачное изображение.
## Пользовательский фильтр
Добавьте Custom Material, выберите материал с шейдером `#pragma postfx` и включите эффект. Готовый пример лежит в `examples/platformer/assets/postfx/cold.aemat`. Шейдер читает предыдущий результат через `aego_sample(aego_uv)`. Сохраните материал, шейдер и сцену, затем проверьте результат в экспортированной игре. На камере есть и выключенный Color Grading с LUT. Подходят отдельные линейные data-текстуры 256×16 или 1024×32.
Для Animation и Tween параметр задаётся через ID экземпляра. Например, на камере платформера путь `render2d.PostProcess.ef120d00000000000000000000000002:Intensity` ведёт к интенсивности Bloom. При перестановке цель сохраняется. У копии эффекта появляется собственный ID. Undo восстанавливает удалённый экземпляр вместе с его ID.
## Материалы в примерах игр
В `examples/platformer/assets/materials/character_flash_lit.aeshader` показано сочетание освещения, нормали текущего спрайта и параметра Flash. Клип Hurt анимирует параметр Flash в компоненте переопределения материала игрока. У соседей с общим материалом сохраняются их собственные значения. Для контура выделения сохраните текущий материал спрайта, назначьте встроенный Outline и верните прежний материал при снятии выделения. В examples/topdown фонарь Torch поворачивается вместе с прицелом меча. Его свет получают пол и стены.
## Инспекция проходов и команды
В секции Lighting профайлера включите просмотр проходов и выберите логический выход. У Bloom видны выделение ярких областей, два направления размытия и композиция. Выключите стек и сравните следующий кадр. Время прохода появляется после получения достоверной выборки от драйвера. У окна показан размер области вывода, у текстуры также указан формат.
Команда `aego postfx get scenes/main.aescene Camera` выводит ID экземпляров. В платформере `aego postfx set scenes/main.aescene Camera ef120d00000000000000000000000002 Intensity 0.35` меняет интенсивность существующего Bloom. Эти команды доступны по MCP. При привязке к редактору изменение попадает в открытый документ и его историю Undo.
---
id: render2d.PostProcess.SetEffectEnabled
---
`instanceID` — постоянный ID существующего эффекта, а не его тип или позиция в стеке. Если экземпляр не найден, скрипт сообщает об ошибке до изменения. Метод меняет переключатель экземпляра; сам компонент тоже должен быть включён.
---
id: render2d.PostProcess.SetFloat
---
`key` имеет вид `instanceID:Field`: например, ID экземпляра Bloom и `:Intensity`. `value` должен соответствовать типу и ограничениям вещественного поля. Неразрешённый экземпляр, отсутствующее поле или несовместимое значение вызывают ошибку скрипта без применения этого присваивания. Меняется экземпляр, а не общий материал.
---
id: render2d.PostProcess.SetInt
---
`key` имеет вид `instanceID:Field`. Целое должно помещаться в знаковый int32 и соответствовать описателю поля. Выход за диапазон или неразрешённая цель вызывают ошибку скрипта до присваивания.
---
id: render2d.PostProcess.SetBool
---
`key` имеет вид `instanceID:Field`; целевое поле должно быть булевым. Неизвестная цель или несовместимый тип поля вызывают ошибку скрипта до присваивания.
---
id: render2d.PostProcess.SetVec2
---
`key` имеет вид `instanceID:Field`; `value` содержит два компонента вектора. Описатель поля должен принимать такое значение. Неразрешённая цель или несовпадение типа вызывают ошибку скрипта до присваивания.
---
id: render2d.PostProcess.SetVec3
---
`key` имеет вид `instanceID:Field`; `value` содержит три компонента вектора. Описатель поля должен принимать такое значение. Неразрешённая цель или несовпадение типа вызывают ошибку скрипта до присваивания.
---
id: render2d.PostProcess.SetVec4
---
`key` имеет вид `instanceID:Field`; `value` — [material.Vec4](ref:aego/material.Vec4) с компонентами X, Y, Z и W. Описатель поля должен принимать такое значение. Неразрешённая цель или несовпадение типа вызывают ошибку скрипта до присваивания.