Постобработка: где выполнять эффект
Выбрать между 2D-обработкой цвета, живой текстурой и 3D-проходом по глубине.
Выбрать место эффекта
Сначала определите, какие данные нужны эффекту. Обработка цвета готовой картинки и чтение глубины 3D-камеры — разные задачи.
| Задача | Подход | Рабочий пример |
|---|---|---|
| обесцвечивание, цветовой фильтр, эффект поверх показанного изображения | ShaderMaterial с canvas_item на ColorRect, нарисованном после изображения | Экранные шейдеры |
| два эффекта, второй читает результат первого | явно обновить экранную копию между проходами | Цепочка с BackBufferCopy |
| отдельная камера для портрета, монитора или предварительного просмотра | SubViewport с камерой и потребитель его ViewportTexture | Живая текстура |
| расстояние до поверхности, depth-based haze | spatial shader в том же 3D viewport, hint_depth_texture и восстановление позиции | 3D-постобработка по глубине |
Canvas_item-пример не переносит depth buffer исходной комнаты в интерфейс. Spatial-пример не гарантирует обработку всего UI и каждого прозрачного материала. Выбирайте точку обработки по нужным данным, а не по тому, какой тип Entity проще добавить.
Запустить проверенную 2D-цепочку
Скачать проект экранных эффектов. Reckfell 1.0.0, C# SDK, Forward+/Vulkan. Откройте project.reckfell, соберите C# и запустите Main.rscene. У корня до запуска выберите Preview=Grayscale; Original показывает исходник, Chained — диагностическую инверсию серого результата.
Сцена содержит живой 3D-источник и последовательность Display → TonePass → Copy → InvertPass. При отключённом Copy второй screen-reading shader читает общую исходную копию, а не обесцвеченное изображение. При CopyMode=Viewport между проходами получает результат первого. Простое добавление ещё одного ColorRect не означает, что входом второго станет выход первого.
CanvasLayer помогает разместить эффект и интерфейс в нужных слоях. Он не является универсальной командой повторного копирования screen_texture. Управляйте реальным порядком рисования и BackBufferCopy явно. Полный код и разбор SCREEN_UV находятся в связанном руководстве; дублировать shader здесь не нужно.
Запустить 3D-проход по глубине
Скачать проект глубины. Те же требования к движку и SDK. Preview=Haze добавляет дымку по восстановленному расстоянию, Original отключает проход, Distance показывает диагностическую маску.
Этот проход — потомок активной камеры. Он читает данные её viewport, использует INV_PROJECTION_MATRIX и не пишет собственную глубину. В Compatibility и Forward+ различается преобразование depth в NDC; ветки уже есть в shader. Не заменяйте их одной формулой без проверки.
Копия цвета в 3D берётся в определённом месте рендера. Она не равна произвольному финальному кадру со всеми прозрачными объектами, частицами и UI. Приоритет материала не меняет момент получения копии. Подробности и законченный код — в руководстве по глубине.
Проверить свой эффект
- Сначала получите исходное изображение без эффекта.
- Нейтральные параметры должны сохранять его цвет. Если уже здесь кадр меняется, проверьте повторный fog/lighting, тонмаппинг, alpha и место копирования.
- Меняйте один параметр за раз. Не подстраивайте одновременно камеру и экспозицию под ошибку shader.
- Для цепочки временно отключите явную копию. Если ожидаемый первый эффект пропал из результата второго, проверьте порядок и точку копирования.
- Для глубины используйте поверхности на известных расстояниях и проверьте смену Near/Far, проекции и рендерера. Внешне правдоподобная серая маска не подтверждает правильность формулы.
Примеры проверены текущей локальной сборкой. Численная реконструкция глубины проверена в OpenGL и Vulkan; полный интерьер и эффекты на иллюстрациях — только в Forward+/Vulkan. Примеры не являются замером производительности, готовым gaussian blur, универсальным compositor для всех буферов или проверкой экспорта приложения.