Разрешение 3D: масштаб, фильтр и неизменный UI
Изменять внутреннее разрешение, отличать его от выходной текстуры и корректно обрабатывать недоступный upscaler.
Что меняется при scale
Scaling3DScale меняет внутреннее разрешение 3D, а не размер окна и не размеры canvas UI. Выходная текстура viewport сохраняет свой размер. Для изменения самого выхода SubViewport используйте его Size отдельно.
| Выход 512×384 | Внутренний 3D-рендер | Доля пикселей от Native |
|---|---|---|
| Scale 0.5 | 256×192 | 25% |
| Scale 1 | 512×384 | 100% |
| Scale 2 | 1024×768 | 400% |
Размеры подтверждены исходниками и диагностическим пространственным шейдером в OpenGL/Vulkan. GetTexture().GetImage() во всех этих случаях остаётся 512×384: это readback выхода, не прямое измерение внутреннего буфера.
Меньше пикселей может помочь при ограничении со стороны GPU. Если время уходит в скрипты, физику или подготовку кадра CPU, уменьшение разрешения может почти не изменить FPS. Четверть внутренних пикселей не означает четырёхкратное ускорение.
Запустить готовое сравнение
Используйте оба полных файла из руководства сглаживания: QualityPreset.cs и QualityLab3D.cs. Нужны C# SDK 1.0.0, net10.0, dotnet build и QualityLab3D.cs на Entity3D-корне .rscene.
Выбирайте Preset перед запуском: Native, HalfBilinear, HalfNearest или DoubleBilinear. Для воспроизводимого сравнения сохраняйте выходное разрешение неизменным; изображения ниже имеют 512×384. Синий индикатор размером 80×20 относится к CanvasLayer и сохраняет размер при смене 3D scale.
Сравнить фильтры
Bilinear смешивает соседние samples при увеличении и выглядит мягче. Nearest сохраняет жёсткую сетку низкого разрешения. В проверке их реальные пиксели различались; UI остался в выходных координатах.
Scale 2 добавил частичное покрытие наклонных краёв после уменьшения. Это более дорогой способ по внутреннему числу пикселей; производительность не измерялась. Для downsampling используйте Bilinear: по исходникам FSR/MetalFX/Nearest при scale больше 1 заменяются внутренним bilinear.
Выбрать upscaler без ложного индикатора
В текущем коде Fsr и Fsr2 применяются в Forward+. Пример FsrHalf/Fsr2Half использует scale 0.5. В Forward+/Vulkan их кадры отличались от HalfBilinear. Временной Fsr2 сравнивался после накопления истории; движение и ghosting этим тестом не оцениваются.
В Compatibility запрос Fsr2 может быть отклонён, а getter продолжит показывать Fsr2. Если до запроса renderer использовал Bilinear, остаётся он; если Nearest — остаётся Nearest. Оба случая воспроизведены. Поэтому нельзя определять фактически применённый алгоритм одним GetScaling3DMode или обещать обязательный bilinear fallback для любого запроса.
QualityPreset.Apply проверяет renderer до изменения состояния. Если возвращён false, оставьте прежнее выбранное значение в игровом меню и сообщите, что режим недоступен. Настройки применяются к переданному viewport: изменение другого viewport не меняет активную игровую картинку.
MetalFX, Mobile, XR и другие GPU в этом примере не запускаются. Их поддержку и ограничения проверяйте отдельно. FsrSharpness не включает FSR и не меняет разрешение; его влияние на качество здесь не исследуется.
Управлять диапазоном и диагностировать
Для конечного Scaling3DScale Viewport ограничивает диапазон 0.1..2. Проверены запросы 0.01→0.1 и 9→2. Отбрасывайте NaN/бесконечность на входе вашего меню; не рассчитывайте на clamp как на полную валидацию любых float.
| Проблема | Проверка |
|---|---|
| GetTexture всё ещё прежнего размера | Это нормально: измеряется выход, не внутренний 3D-буфер |
| Вместе с 3D уменьшился весь интерфейс | Изменён Size/общий stretch вместо отдельного 3D scale |
| FSR указан, картинка nearest | Запрос мог быть отклонён; проверить renderer, предупреждения и прежний режим |
| Пониженный scale не повысил FPS | Профиль CPU/GPU, физики, скриптов и других затрат |
| Тонкие детали пропали | Низкое внутреннее разрешение, фильтр и временной метод по отдельности |
Динамический подбор разрешения требует отдельного контроллера с измерениями и ограничениями. Этот пример переключает фиксированные presets и не выдаёт их за готовую динамическую систему.