Физический свет и экспозиция камеры
Люксы, люмены, ISO и выдержка: единицы, настройка и диагностика яркости.
Физические единицы задают согласованную исходную шкалу для 3D-света и камеры: люксы для направленного освещения, люмены для потока локальных источников, кельвины для цветовой температуры и фотографические параметры экспозиции. Они не исправляют геометрию, материалы, утечки света и отсутствие непрямого освещения.
Используйте этот режим, когда нужна воспроизводимая шкала освещения. Для художественно настроенной игры обычная энергия света и фиксированная экспозиция тоже подходят. Переключение готового проекта в физический режим не сохраняет автоматически прежний баланс яркости.
Настройте весь процесс
- Откройте Project Settings, включите Advanced, затем Rendering → Lights And Shadows → Use Physical Light Units (
rendering/lights_and_shadows/use_physical_light_units). Перезапустите редактор и игру. Это настройка запуска, а не надёжный покадровый переключатель. - Назначьте
CameraAttributesPhysicalсвойствуCamera3D.Attributesактивной камеры. Атрибуты камеры управляют экспозицией отдельно от ресурсаEnvironment, который отвечает за тональное преобразование. - Для согласованной экспозиции мира и предпросмотра редактора также задайте подходящие атрибуты в
WorldEnvironment.CameraAttributes. Собственные атрибуты игровой камеры имеют для неё приоритет. Фокусное расстояние и границы отсечения применяются к Camera3D при назначении физического ресурса самой камере; настройка мира не задаёт объективы всех камер. - На время настройки баланса отключите Auto Exposure. Осознанно задайте
ExposureMultiplierиEnvironment.TonemapExposure: это отдельные множители. - Настройте интенсивность света, температуру и яркость фона. Начните с
LightEnergy = 1, чтобы дополнительный художественный множитель не скрывал выбранную шкалу. При работе над интерьером уберите или перенастройте солнце и фон предпросмотра. - Сравнивайте одну камеру и один материал перед следующими изменениями. Проверяйте целевой рендерер и устройство: одинаковые эффекты на всех бэкендах эти настройки не гарантируют.
Когда режим выключен, физическая камера продолжает управлять объективом/FOV и границами отсечения. Однако ISO, выдержка и диафрагма не влияют на нормализацию её экспозиции. Явный ExposureMultiplier продолжает работать. Диафрагма также может участвовать в расчёте глубины резкости на поддерживаемом рендерере.
Значения камеры: не перепутайте единицы
При включённых физических единицах, отключённой автоэкспозиции и неизменной освещённой поверхности:
| Свойство C# | Единица / смысл | Изменение линейного освещения |
|---|---|---|
ExposureSensitivity | ISO | 100 → 200: вдвое ярче. |
ExposureShutterSpeed | Обратные секунды, в C# тоже | 50 → 100: время меняется с 1/50 с на 1/100 с; вдвое темнее. |
ExposureAperture | Диафрагменное число | 2 → 4: вчетверо темнее. Большее число означает меньшее отверстие. |
ExposureMultiplier | Безразмерный множитель | 1 → 2: вдвое ярче; работает и без физических единиц. |
FrustumFocalLength | Миллиметры | Вертикальный FOV и участие в расчёте глубины резкости. Не множитель экспозиции. |
FrustumFocusDistance | Метры | Дистанция фокусировки, не фокусное расстояние и не отсечение. |
FrustumNear, FrustumFar | Метры | Ближнее/дальнее отсечение. Задавайте положительные расстояния, near меньше far. |
Для 1/50 секунды задайте ExposureShutterSpeed = 50f, а не 0.02f. Второе значение в этом API означает 50 секунд и может вызвать сильный пересвет.
Для фиксированной физической экспозиции версия 1.0.0 рассчитывает нормализацию как ISO / (120 × диафрагменное число² × значение выдержки), затем умножает на ExposureMultiplier. Это объясняет соотношения выше, но не калибрует произвольный ассет по реальным измерениям. Из-за тонального преобразования, обрезания и кодирования дисплея удвоение линейного освещения не обязано удваивать числа пикселей снимка.
Изменение ISO само по себе не добавляет фотографический шум сенсора. Параметр выдержки меняет экспозицию, а не включает размытие движения. Глубина резкости — отдельный эффект с затратами GPU там, где он активен. По исходникам DOF поддерживается в Forward+ и Mobile, но не Compatibility; проверки изображения для этой статьи выполнены только в Forward+.
Создайте атрибуты камеры в C#
Класс ниже возвращает ресурс с объективом 35 мм, фокусировкой на 3 м и фиксированной экспозицией. Это исходный пример, а не универсальный пресет яркости. Сначала включите настройку проекта и перезапустите его, затем назначьте ресурс свойству Attributes нужной камеры.
using Reckfell;
public static class PhysicalCameraSetup
{
// Example starting point, not a universal lighting preset.
// Enable use_physical_light_units in Project Settings and restart first.
public static CameraAttributesPhysical Create()
{
return new CameraAttributesPhysical
{
ExposureSensitivity = 100f,
ExposureAperture = 2.8f,
ExposureShutterSpeed = 50f, // 1/50 second, not 0.02 here.
ExposureMultiplier = 1f,
AutoExposureEnabled = false,
FrustumFocalLength = 35f, // Millimeters.
FrustumFocusDistance = 3f, // Meters.
FrustumNear = 0.1f,
FrustumFar = 100f,
};
}
}Camera3D удерживает назначенный ресурс; не вызывайте для него Dispose сразу после назначения. Если несколько камер используют одни атрибуты, изменение ресурса затронет всех пользователей. Создайте отдельные экземпляры, если настройки должны различаться.
Назначение CameraAttributesPhysical камере заменяет её FOV, near/far и поведение соотношения сторон настройками физического ресурса. Увеличение фокусного расстояния сужает вертикальный FOV; реализация использует сенсор 36 × 24 мм и сохраняет вертикальное кадрирование. Поэтому широкий viewport показывает больше по горизонтали. Для изменения перспективы перемещайте камеру: одно лишь фокусное расстояние меняет объектив и кадрирование.
Значения света и фона
| Настройка | Смысл в физическом режиме | Частая ошибка |
|---|---|---|
DirectionalLight3D.LightIntensityLux | Освещённость направленного света, люксы. | Подставлять сюда поток лампы в люменах. |
OmniLight3D / SpotLight3D.LightIntensityLumens | Световой поток локального источника, люмены. | Считать его освещённостью поверхности на произвольном расстоянии. |
Light3D.LightEnergy | Дополнительный множитель энергии. | Менять одновременно интенсивность и энергию, не отслеживая причину изменения. |
Light3D.LightTemperature | Температура в кельвинах, сочетается с LightColor. | Ожидать нейтральный свет при 6500 K, сохранив окрашенный LightColor. |
Environment.BackgroundIntensity | Яркость фона в нитах с учётом его множителя энергии. | Настраивать лампы интерьера на фоне случайно слишком яркого неба. |
Температура около 6500 K приблизительно нейтральна; меньшие значения дают более тёплый оттенок, большие — более холодный. Движок сочетает цвет температуры с LightColor в линейном пространстве. При отключённых физических единицах температура и физическая интенсивность не влияют на рендер света.
SpotLight3D использует упрощённый перевод потока в интенсивность: изменение угла конуса не даёт полностью откалиброванную модель реального прожектора. Не заявляйте точное фотометрическое совпадение по одному числу люменов. Важны данные источника, масштаб, материалы, затухание и экспозиция камеры.
Найдите причину неправильной яркости
| Проблема | Действие |
|---|---|
| После включения физических единиц сильный пересвет | Перезапустите проект, проверьте атрибуты активной камеры, интенсивность солнца/неба и оба множителя экспозиции. |
| ISO или выдержка не влияют на кадр | Проверьте настройку запуска, атрибуты активной камеры и использование unshaded материалом. |
| Собственная unshaded-поверхность игнорирует экспозицию камеры | В проверенном Forward+ её неосвещённый ALBEDO обходит нормализацию света камеры. Множитель экспозиции Environment продолжает действовать. Сравнивайте физический свет на освещаемом материале. |
| Предпросмотр редактора отличается от игры | Проверьте атрибуты мира и переопределения камеры, свет предпросмотра и Environment каждого вида. |
| Экспозиция будто сама отменяет изменения | Отключите автоэкспозицию для сравнения фиксированных настроек. Она поддерживается в Forward+, а не на всех рендерерах. |
| Яркость лампы неверна после изменения масштаба комнаты | Проверьте расстояния и единицы: люмены или люксы. Экспозиция не исправляет неверный масштаб. |
| После назначения атрибутов объекты исчезли | Проверьте near/far ресурса и новое кадрирование объектива. |
| Стена освещается сквозь потолок | Проверьте геометрию и тени. Физические единицы не создают недостающее перекрытие света. |
Проверено: 30 нативных проверок в двух отдельных запусках игры на Windows Forward+/Vulkan. Они измеряют соотношения экспозиции/люксов/энергии по отрисованным пикселям, оттенок температуры, поведение unshaded и обновление проекции камеры. Они не подтверждают абсолютную фотометрическую калибровку, качество DOF, адаптацию автоэкспозиции, размытие движения, совпадение предпросмотра редактора, другие рендереры и экспортированные сборки. Ошибки обрезания яркости и сохранения файлов разобраны в статье HDR и экспозиция.