Целочисленное масштабирование без размытия

Кратко

Проблема

Full HD на 4K-мониторе выглядит хуже, чем на Full-HD-мониторе.

Это происходит из-за размытия, добавляемого мониторами и видео­драйверами при любом масштабном коэффи­циенте, хотя при увеличении в целое количество раз (например, 2 в случае FHD→4K) этого можно избежать.

В результате в трёхмерных играх снижается резкость, белые линии становятся серыми, а пиксельная графика (pixel art) перестаёт быть пиксельной.

Решение

Можно было бы каждую логическую точку отображать как квадратную группу из целого (2×2, 3×3) количества физических точек одинакового цвета.

Такое масштаби­рование без потерь качества можно встроить в драйверы видеокарт, это автоматически устранит размытие вне зависимости от исполь­зуемого монитора.

Смотреть демо

Что делать

  • Подпишите петицию о масштабировании без размытия в видеодрайвере.
  • Проголосуйте за добавление функции в видеодрайвер AMD.
  • Выразите поддержку на форумах nVidia, AMD, Intel.
  • Пожалуйтесь на размытие в техподдержку производителя вашего видеочипа: nVidia, AMD, Intel (1, 2).
  • Пожалуйтесь на размытие в техподдержку производителя вашего монитора или телевизора.
  • Спрашивайте о поддержке масштаби­рования без размытия в коммен­тариях к обзорам видеокарт, мониторов и телевизоров в СМИ.
  • Предложите встроить функцию в игровые движки Unity, CryEngine.
  • Расскажите о проблеме как можно большему количеству людей.

Подписать петицию Проголосовать в опросе AMD

Прогресс

  • Intel: поддержка для видеоядер 11-го поколения в драйвере 25.20.100.7155 () для Windows 10; доступно с сентября в ноутбуках с процессорами 10-го поколения.
  • nVidia: ограниченная поддержка для RTX и GTX 16* в драйвере 436.02 () для Windows 10; несовместимо с HDR, пользовательскими разрешениями, DSR, 4:2:0, повышением резкости и ноутбуками с гибридной графической подсистемой.
  • AMD: включено в опросы от  и ; идёт работа по реализации для ядра Linux 5.4, стабильная версия которого ожидается в конце 2019 года.
  • Мониторы: анонсировано для 27″ QHD-монитора EVE Spectrum, ожидается в 1-м или 2-м квартале .
  • Linux: ограниченная поддержка в XRandR и видео­драйвере nVidia: во многих играх изображение усекается.

Что такое масштабирование

Изображение на компьютерных мониторах и телевизорах состоит из точек (пикселов). Количество точек по горизонтали и вертикали называется разрешением.

Масштабирование — это изменение размеров (разрешения) изображения. Оно необходимо, если физическое разрешение монитора или телевизора отличается от разрешения подаваемого на него видеосигнала: например, если игра в разрешении 1920×1080 (Full HD) запускается в полноэкранном режиме на мониторе с физическим разрешением 3840×2160 (4K).

Проблема — размытие

На всех мониторах, видеокартах и большинстве телевизоров масштаби­рование приводит к снижению резкости при любом коэффи­циенте масштаби­рования. Такое снижение резкости воспринимается как размытие и представляет собой необратимую потерю качества.

Но на самом деле размытие неизбежно, только если разрешение монитора некратно разрешению сигнала. Например, невозможно одну логическую точку (пиксел) отобразить как 1,5 физических пиксела, поэтому приходится применять интерполяцию, состоящую в пропорциональном усреднении цветов соседних пикселов масштабируемого изображения.

Решение — целочисленное масштабирование

Если коэффи­циент масштаби­рования не дробный (например, 1,5), а целочис­ленный (например, 2 или 3), то размытия можно избежать, отобразив каждый логический пиксел как квадратную группу из целого (например, 2×2 или 3×3) количества физических пикселов одинакового цвета — т. е. просто повторив соответствующий пиксел исходного изображения несколько раз без какого-либо влияния цветов соседних пикселов.

Такое масштаби­рование без потерь качества известно как integer (integer-ratio, integer-factor, integral) scaling (масштаби­рование с целочис­ленным коэффи­циентом), pixel-perfect scaling (масштаби­рование с точной привязкой к физическим пикселам), pixel doubling (duplication) (удвоение, или дублирование, пикселов).

Больше, чем интерполяция «По соседним»

Интерполяция «По соседним» («Ближайший сосед», «Nearest Neighbour») работает без потерь качества только при целочисленных соотношениях размеров результирующего и исходного изображений, а при дробных соотношениях приводит к искажениям. Целочис­ленное масштаби­рование свободно от потерь всегда.

Размытия можно избежать даже при некратных разрешениях экрана и изображения: достаточно отмасштабировать изображение с таким целочис­ленным коэффи­циентом, при котором оно максимально заполнит экран, а оставшееся пространство — залить чёрным фоном так же, как при выводе изображения по центру экрана без масштаби­рования.

Например, изображение 1280×1024 можно вывести на экран 3840×2160, отобразив каждый пиксел изображения как группу из 4-х (2×2) одинаковых физических пикселов с чёрными полями по 56 физических пикселов наверху и внизу и по 640 — слева и справа.

Примеры

Пиксельная графика

Различия между билинейной интерполяцией с размытием и целочис­ленным масштаби­рованием без потерь качества наглядно видны на примере пиксельной графики, или пиксель-арта (pixel art):

Фото

См. также фотографии одного и того же скриншота программы Reaper, сделанные с использованием трёх способов масштабирования:

Демо

Для лучшего понимания сути целочис­ленного масштаби­рования без размытия см. демо-страницу. Есть возможность сравнить изображение, отмасштаби­рованное с целочи­сленным коэффи­циентом без размытия, и обычное размытое изображение. Поддер­живаются просмотр произвольных изображений и коррекция соотношения сторон.

Сценарии использования

Работа в разрешении ниже физического разрешения дисплея имеет смысл для следующих целей:

  • повышение быстродействия в современных трёхмерных играх на дисплеях 4K+, особенно на ноутбуках;
  • возможность на дисплеях 4K+ играть в игры, не рассчитанные на HiDPI-дисплеи:
    • не масштабирующие свой пользовательский интерфейс;
    • в разрешениях 4K и выше работающие неправильно;
  • при масштаби­ровании без размытия — сохранение пикселизации в старых и pixel-art-играх.

Почему это важно

  • На 4K-мониторах при диагонали 24—27″ при разрешении Full HD отдельные пикселы изображения почти неразличимы, и размытие не даёт никакого эффекта сглаживания, а просто бессмысленно снижает резкость, приводя к неоправданной потере качества.
  • Все 4K-мониторы масштабируют с размытием, поэтому проблему можно решить только средствами видеодрайвера.
  • В режиме nVidia G-Sync масштаби­рование монитора не задействуется (1, 2, 3), поэтому единственный путь к правильному масштаби­рованию в режимах с переменной частотой обновления (VRR) — масштаби­рование средствами видеодрайвера.
  • В видеодрайверах nVidia и AMD уже реализованы технологии виртуализации разрешения — nVidia DSR и AMD VSR, и технически остаётся лишь добавить поддержку коэффи­циентов ниже 1.
  • С точки зрения быстродействия целочис­ленное масштаби­рование повторением пикселов работает гораздо быстрее, чем масштаби­рование с использованием билинейной или бикубической интерполяции, поэтому применение целочис­ленного масштаби­рования может уменьшить или устранить задержку (lag), вносимую масштабированием.
  • Пользователь имеет право на отсутствие неоправданных потерь качества при работе в разрешениях, отличных от физического разрешения дисплея.
  • Более быстродействующая видеокарта имеет большее тепловыделение (TDP) и увеличенный шум системы охлаждения. Это отрицательно влияет на комфорт пользователя и в долгосрочной перспективе приводит к необратимому снижению слуха. В той же мере это относится к видеокарте, вычислительные ресурсы которой задействуются в более высокой степени, чем могли бы в более низком разрешении.
  • Более быстродействующая видеокарта проблему не решает, т. к. дело не только в быстродействии (см. далее).

Ещё важнее с ростом физического разрешения

Чем выше физическое разрешение экрана, тем важнее и эффективнее целочис­ленное масштабирование.

  • Чем выше физическое разрешение экрана, тем труднее достичь комфортного быстродействия игр при его использовании. Разрешение 4K вчетверо выше Full HD. Разрешение 8K (7680×4320) ещё в 4 раза выше.
  • Чем выше физическое разрешение экрана, тем менее заметен логический пиксел при тех же размере экрана и масштабном коэффи­циенте, и тем менее оправдано размытие как своего рода сглаживание. Например, на 4K-мониторе логическую точку (пиксел) при разрешении Full HD (1920×1080) ещё при желании можно разглядеть при определённом сочетании размера экрана, расстояния до экрана и качества сглаживания в игре. Но при физическом разрешении 8K и разрешении сигнала 4K логический пиксел в типичных условиях использования будет совершенно неразличим.
  • Появляется возможность более полно использовать площадь экрана при целочис­ленном масштаби­ровании. Например, при типичном для DOS-игр разрешении 320×240 высота экрана Full HD (1920×1080) при целочис­ленном масштабе заполняется лишь на 89% (используется 960 из 1080 точек, увеличение четырёхкратное), а на 4K-мониторе высота используется полностью (масштабный коэффи­циент — ровно 9).

    Исходное разрешение Разрешение после масштабирования Примечание
    FHD 4K 8K
    Масштаб Потеря высоты Масштаб Потеря высоты Масштаб Потеря высоты
    256×224
    SNES
    4,8 17% 9,64 6,7% 19,3 1,5% На 4K потеря высоты в 2,6 раза меньше, чем на FHD. На 8K — в 4,5 раза меньше, чем на 4K, и в 11,5 раз меньше, чем на FHD
    320×240
    qVGA
    4,5 11,1% 9 0 18 0
    640×480
    VGA
    2,25 11,1% 4,5 11,1% 9 0 Потери высоты на FHD и 4K одинаковы
    800×600
    SVGA
    1,8 44,4% 3,6 16,7% 7,2 2,8% На FHD умещается только при масштабе 100% (без увеличения). На 4K потеря высоты в 2,67 раза меньше, чем на FHD; на 8K — в 6 раз меньше, чем на 4K, и в 16 раз меньше, чем на FHD
    1024×768
    XGA
    1,4 28,9% 2,81 28,9% 5,63 11,1% На FHD умещается только при масштабе 100% (без увеличения). На 8K потеря высоты в 2,6 раз меньше, чем на 4K и FHD
  • Появляется возможность ещё полнее использовать площадь экрана путём использования логических пикселов с переменным размером с разницей в размере соседних пикселов в 1 физический пиксел. Чем больше физических пикселов в логическом пикселе, тем менее заметна разница в 1 физический пиксел.

    Например, для разрешения 256×224, характерного для 16-битных игровых приставок, на экране Full HD максимальный целочис­ленный коэффи­циент составляет 4 (полный дробный коэффи­циент — 4,82), по умолчанию по вертикали пропадают 184 пиксела, или 17% высоты экрана. Но если увеличить высоту каждого второго логического пиксела на 1 физический пиксел (4×5 вместо 4×4), то потерянная высота сократится в 2,5 раза — пропадут уже всего 72 физических пиксела, или 7% высоты экрана. (Для сохранения соотношения сторон изображения следует дополнительно пропорционально растянуть изображение по ширине.)

    Однако разница 25% в высоте пикселов в соседних строках на FHD-экране может бросаться в глаза. На 4K-экране относительное увеличение высоты пиксела составляет всего 11% (9×9 → 9×10) — и значительно менее заметно. На 8K-экране в аналогичных условиях разница в высоте пикселов составляет всего 5% (19×19 → 19×20), при этом увеличение высоты пиксела в каждой 4-й строке сокращает потерянную высоту в 8 раз — с 64 до 8 пикселов.

  • Экраны с разрешением 8K при челочисленном масштаби­ровании позволят использовать без потерь качества любое из типичных разрешений: HD (1280×720, 6x), FHD (1920×1080, 4x), QHD (2560×1440, 3x), 4K (3840×2160, 2x).

Мощная видеокарта — не решение

Приобретение более быстродействующей видеокарты не решает проблему:

  • если экраном повышенного разрешения оснащён ноутбук, установка мощной видеокарты практически невозможна из-за естественных ограничений по габаритам, энергопотреблению и тепловыделению;
  • многие игры содержат растровые (точечные) элементы (например, меню в «Half-Life 2» и панели инструментов в «Cities XL Platinum»), которые в разрешении 4K становятся мелкими, и играть в игру почти невозможно;
  • некоторые игры работают в разрешении 4K неправильно (например, в «Bionic Commando Rearmed» не видны элементы головоломок на мини-уровнях «Hack enemy network»);
  • некоторые игры (например, «Duck Tales Remastered») имеют фиксированное разрешение (например, Full HD), а поддержка остальных разрешений достигается масштаби­рованием с размытием;
  • в играх на основе пиксельной графики (pixel art) быстродействие не является проблемой, а важен пикселизованный характер изображения без неуместного размытия, не соответст­вующего замыслу авторов игры.

Видеокарта с более высоким быстродействием здесь бессильна.

Частичные решения

Масштабирование, встроенное в игры

В некоторые современные игры масштаби­рование без размытия встроено. В основном это характерно для игр на основе пиксельной графики (pixel art), но встречается и в некоторых трёхмерных играх.

  • Масштабирование без размытия встроено в игру Owlboy () (приключенческий платформер на основе пиксельной графики).
  • В игру QuakeSpasm (Quake на более современном движке) начиная с версии 0.93.0 () встроена возможность целочис­ленного масштаби­рования без размытия с коэффи­циентами до 400% с помощью конфигурационного параметра r_scale. Для использования этой возможности следует в подпапку ID1 папки игры поместить текстовый файл autoexec.cfg, содержащий параметр вида r_scale 4, где 4 указывает на масштабный коэффи­циент. Например, при выбранном в игре разрешении 3840×2160 игра отрисовывается в разрешении 960×540 и масштабируется до 3840×2160 без размытия путём отображения каждого логического пиксела как квадратной группы из 16-ти (4×4) физических пикселов одинакового цвета.
  • В игру Dusk () (3D-шутер в ретростиле) встроена возможность целочис­ленного масштаби­рования без размытия с коэффи­циентами до 800%. Для этого служит параметр «Pixelization» → «1x-8x» в разделе «Advanced Display Settings» настроек игры. По некоторым данным, по умолчанию параметр установлен в значение «2x», что, например, при физическом разрешении 4K соответствует логическому разрешению Full HD.

Программы масштабирования

  • Для масштаби­рования Windows-игр, поддерживающих оконный режим, можно использовать программу IntegerScaler.
  • Для масштаби­рования 3D-игр можно использовать программу GeDoSaTo. Недостатки:

    • поддерживает только относительно старые игры, использующие DirectX 9 и ниже;
    • работает лишь с некоторыми из них;
    • современные версии программы на некоторых системах не работают вообще, у автора этих строк заработала одна из предыдущих версий — Beta 10 Poltergeist.

Эмуляторы Glide и DirectX

Glide — программный интерфейс (API), использовавшийся в видеокартах 3dfx. Glide-эмуляторы позволяют играть в игры с поддержкой Glide на компьютерах, поддерживающих современные API DirectX и OpenGL.

  • Glide-эмулятор nGlide начиная с версии 2.10 () поддерживает целочис­ленное масштаби­рование без размытия (Options → Aspect ratio → Integer scaling).
  • DgVoodoo (эмулятор Glide и «обёртка» для DirectX 8 и ниже) и DXGL (OpenGL-реализация DirectDraw) поддерживают алгоритм масштаби­рования без размытия «По соседним» («Nearest Neighbour») (источники: 1, 2).

Эмуляторы игровых приставок и движки для старых игр

  • SNES-эмулятор Snes9x начиная с версии 1.56.2 () поддерживает целочис­ленное масштаби­рование (Video → Display Configuration (Display Settings) → General → Integer Scaling). При этом для предотвращения размытия следует снять галку Video → Bilinear Filtering, а во избежание других искажений исходного изображения — в обоих выпадающих списках Video → Display Configuration (Display Settings) → Output Image Processing выбрать значение None. В качестве способа вывода (Video → Display Configuration (Display Settings) → General → Output Method) необходимо выбрать «Direct3D» или «OpenGL»; в режиме «DirectDraw» функция не работает. Ограничение: при использовании фильтра «Scanlines» используется чётный масштабный коэффи­циент, из-за чего высота экрана может использоваться менее полно, чем без фильтра «Scanlines»: например, на 4K-мониторе используется коэффи­циент 8 вместо 9.
  • SNES-эмулятор Snes9x EX+ для Android начиная с версии 1.4.4 () поддерживает целочис­ленное масштаби­рование (Options → Video → Zoom → Integer-only). При этом для предотвращения размытия следует установить параметр Options → Video → Image Interpolation в значение None вместо используемого по умолчанию Linear.
  • SNES-эмулятор Mesen-S поддерживает целочис­ленное масштаби­рование: Options → Video → General → Use integer scale values when entering fullscreen mode. При этом для предотвращения размытия должна быть снята галка Picture → Use bilinear interpolation when scaling (снята по умолчанию). Поддерживается отсечение заданного количества пикселов исходного изображения по отдельности для каждой из сторон, благодаря чему можно полнее использовать площадь экрана: Options → Video → Overscan.
  • Эмулятор 8/16-битных игровых приставок higan для Windows начиная с версии 104 () поддерживает целочис­ленное масштаби­рование (Settings → Video → Windowed Mode / Fullscreen Mode → Integral scaling). При этом для предотвращения размытия следует снять галку Settings → Video Emulation → Blurring, а параметр Settings → Video Shader установить в значение None вместо используемого по умолчанию Blur.
  • В SNES-эмуляторе bsnes для Windows начиная с версии 107 () в режиме центрированного вывода (Settings → Output → Center) автоматически применяется целочис­ленное масштаби­рование. При этом для предотвращения размытия следует параметр Settings → Shader установить в значение None вместо используемого по умолчанию Blur. Ограничение: при использовании фильтра «Scanlines» и нечётном масштабном коэффи­циенте (например, 9 при физическом разрешении 4K) в сочетании с механизмом отрисовки «OpenGL 3.2» (Settings → Drivers → Video → Driver) scanline-линии отрисовываются неравномерно: например, на 4K-мониторе каждая 7-я линия на 1 пиксел толще остальных.
  • NES-эмулятор Mesen начиная с версии 0.9.1 () поддерживает целочис­ленное масштаби­рование: «Опции» → «Видео» → «Общие» → «Use integer scale values when entering fullscreen mode» (Options → Video → General → Use integer scale values when entering fullscreen mode). При этом для предотвращения размытия должна быть снята галка «Изображение» → «Билинейная интерполяция» (Picture → Use bilinear interpolation when scaling) (снята по умолчанию). Поддерживается отсечение заданного количества пикселов исходного изображения по отдельности для каждой из сторон, в том числе индивидуально для каждой игры, благодаря чему можно полнее использовать площадь экрана: «Опции» → «Видео» → «Overscan» (Options → Video → Overscan).
  • NES-эмулятор puNES начиная с версии 0.105 () поддерживает целочис­ленное масштаби­рование: Settings → Video → Misc → Use integer scaling in full­screen. При этом для предотвращения размытия следует снять галку Interpolation.
  • mGBA — эмулятор карманных игровых систем Game Boy, Game Boy Color и Game Boy Advance — начиная с версии 0.6 () поддерживает целочис­ленное масштаби­рование: Audio/Video → Force integer scaling. При этом для предотвращения размытия галка Audio/Video → Bilinear filtering должна быть снята (по умолчанию снята).
  • SameBoy — эмулятор карманных игровых систем Game Boy и Game Boy Color — начиная с версии 0.9 () поддерживает целочис­ленное масштаби­рование (Graphic Options → Scaling Mode → Retain Integer Factor). При этом для предотвращения размытия следует установить параметр Graphic Options → Scaling Filter в значение Nearest Neighbor. Эмулятор формально несовместим с HiDPI (не является DPI-aware), поэтому для гарантии отсутствия размытия и для максимального использования площади экрана рекомендуется отключить DPI-виртуализацию в свойствах его исполняемого файла.
  • Эмулятор множества игровых систем и старых компьютеров MAME поддерживает целочис­ленное масштаби­рование без размытия. Для включения целочис­ленного масштаби­рования служит параметр командной строки -nounevenstretch или его краткий вариант -noues. Выключить размытие можно параметром командной строки -nofilter, либо установив параметр Configure Options → Video Options → Bilinear Filtering в настройках MAME в значение Off.

    Алгоритм целочис­ленного масштаби­рования в MAME использует пикселы одинакового размера, поэтому при малых масштабных коэффи­циентах соотношение сторон отмасштаби­рованного изображения может не точно соответствовать необходимому, если игре требуется коррекция соотношения сторон (aspect-ratio correction). Например, в аркадной версии игры «Mortal Kombat 3» (исходное разрешение — 400×254, целевое соотношение сторон — 4:3) на FHD-дисплеях изображение заметно сужено по горизонтали (размер логического пиксела — 3×4 физических пиксела, погрешность — 11,42%), а на 4K-дисплеях нарушение пропорции незаметно (размер пиксела — 7×8, погрешность — 3,34%).

  • Cemu — экспериментальный эмулятор игровой приставки Wii U для Windows — начиная с версии 1.15.2 () поддерживает алгоритм масштаби­рования «По соседним» («Nearest Neighbour») (Options → General settings → Graphics → Upscale filter / Downscale filter → Nearest Neighbor). Произвольное разрешение можно установить для каждой конкретной игры с помощью графических пакетов (Options → Graphic packs).
  • Оболочка RetroArch для эмуляторов игровых приставок поддерживает челочис­ленное масштаби­рование (Settings → Video → Integer Scale → On). Для отключения размытия следует установить параметр Settings → Video → Bilinear Filtering в значение Off.
  • Оболочка BizHawk для эмуляторов игровых приставок поддерживает челочис­ленное масштаби­рование (Config → Display → Scaling & Filtering → Expand pixels by integers only (e.g no 1.3333x)). Для отключения размытия следует установить параметр Final Filter в значение None (по умолчанию). Но периодически изображение выводится с ошибочным соотношением сторон и искажёнными пропорциями пикселов.
  • Программа ScummVM, современная среда для запуска множества старых игр типа «Broken Sword», начиная с версии 2.1 () поддерживает целочисленное масштабирование: «Настройки» → «Графика» → «Режим р…гивания» → «Масштабирование пиксель-в-пиксель» («Options» → «GFX» → «Stretch mode» → «Pixel-perfect scaling». Отключить размытие можно снятием галки «Фильтрование графики» («Filter graphics»).

    В оконном режиме доступна также возможность вывода с фиксированными целочис­ленными масштабами 2x (200%) и 3x (300%) («Настройки» → «Графика» → «Граф. режим») («Options» → «GFX» → «Graphics mode»), но глобальная настройка применяется только к играм с разрешением не более 320×240, а для игр с более высоким разрешением требуется задавать эту настройку с помощью индивидуального для игры набора настроек: «Настройки игры» → «Графика» → «Перекрыть глобальные установки графики» («Edit Game» → «Graphics» → «Override global graphic settings»).

    Программа формально несовместима с HiDPI (не является DPI-aware), поэтому для гарантии отсутствия размытия и для максимального использования площади экрана рекомендуется отключить DPI-виртуализацию в свойствах её исполняемого файла.

    В графическом режиме «OpenGL» программа может переключать 4K-монитор в разрешение Full HD, что может приводить к размытию из-за масштабирования средствами монитора или видеокарты. Помогает переключение программы в другой графический режим — например, «3x».

    ScummVM также доступна как ядро libretro, которое можно использовать с таким оболочками, как RetroArch или BizHawk, в которые встроены собственные реализации целочисленного масштабирования.

Виртуализация ОС

  • Для запуска DOS-программ — эмулятор DOSBox ECE — улучшенная неофициальная версия программы DOSBox, поддерживающая целочис­ленное масштаби­рование без размытия. В отличие от обычной версии DOSBox, в ECE-версии реализовано полноценное масштаби­рование без использования фильтров, благодаря чему поддерживается масштаби­рование без размытия в полноэкранном режиме, масштабный коэффи­циент вычисляется автоматически и не ограничен малыми значениями (3x в официальных сборках DOSBox).

    В качестве значения параметра output в разделе [sdl] конфигурационного файла (*.conf) для игры следует использовать значение openglpp или surfacepp либо не задавать этот параметр вовсе. Для отключения коррекции соотношения сторон (например, растяжения 320×200 до высоты 240, соответствующей соотношению 4:3) и включения строго квадратных пикселов служит параметр aspect=false в разделе [render] конфигурационного файла. Включить вертикальную синхронизацию (V-Sync) при output=openglpp можно параметром glfullvsync=true в разделе [sdl]. Дополнительную информацию см. в readme-файле pixel-perfect-патча, включённом также и в дистрибутив DOSBox ECE (README for pixel-perfect patch.txt).

    Пример конфигурационного файла DOSBox ECE для игры «Epic Pinball»:

    [sdl]
    fullscreen=true
    output=openglpp
    glfullvsync=true

    [cpu]
    cycles=4000

    [autoexec]
    mount C "."
    C:
    cd \EPICPIN
    PINBALL.EXE
    exit

  • Среда виртуализации VirtualBox поддерживает масштаби­рование экрана виртуальной машины без размытия в диапазоне 100—300%: Машина → Настроить → Дисплей → Экран → Коэффи­циент масштаби­рования (Machine → Settings → Display → Screen → Scale Factor).

Просмотр изображений и видео

  • Для просмотра изображений — программа XnView со снятой галкой Инструменты → Опции → Вид → Высокое качество при масштаби­ровании → При увеличении (Tools → Options → View → High quality zoom → Enlarge). Ограничение: настройка применяется ко всем просматриваемым изображениям вне зависимости от кратности их размеров размеру окна программы и использования полноэкранного режима.
  • Для просмотра видео — плеер MPC-HC с настройкой Вид → Настройки → Воспроизведение → Вывод → Интерполяция → Ближайший сосед (View → Options → Playback → Output → Resizer → Nearest neighbor). Настройка доступна при использовании движков отрисовки «Video Mixing Renderer 9 (renderless)», «Расширенный рендер видео (EVR custom presenter)» («Enhanced Video Renderer (custom presenter)») и «Sync Renderer». Движок отрисовки можно выбрать с помощью выпадающего списка «Вывод DirectShow» («DirectShow Video») на той же странице настроек. Ограничение: настройка применяется ко всем видео вне зависимости от кратности размеров видеокадра размеру окна программы и использования полноэкранного режима.

Встроенные средства Windows

  • Для оконных программ — экранная лупа Windows (Windows Magnifier). Недостатки:

    • неудобный интерфейс — трудно точно совместить масштабируемую область с границами подлежащего масштаби­рованию объекта;
    • при некратных размере подлежащего масштаби­рованию объекта и разрешении монитора область вокруг объекта не заполняется однотонной заливкой, поэтому помимо подлежащего масштаби­рованию объекта видны посторонние объекты;
    • в оконном режиме — задержка (lag) и подёргивание;
    • в режиме вывода на полный экран — подёргивание как минимум в некоторых играх (например, WRC 6) (возможно, только в Windows 7) и возможная задержка (lag).
  • Для оконных Windows-программ, несовместимых с HiDPI — использование Windows 10, где, в отличие от Windows 7, старые программы при целочис­ленных системных масштабах автоматически масштабируются без размытия.
  • В Windows 10 для игр с поддержкой псевдо­полно­экранного режима «Borderless» возможно масштаби­рование без размытия с масштабом, равным системному масштабу.

    «Borderless» — особый вариант оконного режима, который отличается от обычного оконного режима тем, что использует окно без рамок и заголовочной панели, и вся площадь окна представляет собой область отрисовки игры. В зависимости от конкретной игры или её настроек такое окно может занимать весь экран без возможности задать разрешение в настройках игры, либо иметь фиксированный размер, равный внутриигровому разрешению.

    Для масштаби­рования с помощью Borderless-режима:

    • игра должна быть запущена в режиме DPI-виртуализации (DPI scaling) — встроенном в Windows режиме масштаби­рования устаревших программ, не рассчитанных на экраны с высокой плотностью точек;
    • в настройках игры должен быть выбран режим «Borderless». В разных играх этот режим может называться по-разному, например, «Borderless Full Screen», «Borderless Windowed», «Borderless», «Windowed Fullscreen», «Fullscreen Windowed». В некоторых играх режим, называемый полноэкранным («Full Screen»), на самом деле представляет собой режим «Borderless» вместо настоящего (exclusive) полноэкранного режима;
    • разрешение в игре должно быть в точности настолько меньше системного, какой масштаб задан в Windows.

    Например, если для монитора разрешением 3840×2160 (4K) в Windows 10 задан масштаб 200% (коэф­фициент — 2), разрешение в настройках игры должно быть 1920×1080 (Full HD):

    3840 / 1920 = 2
    2160 / 1080 = 2

    Принудительно включить DPI-виртуализацию для игры, даже если она объявлена как совместимая с HiDPI (DPI-aware), в Windows 10 можно через свойства исполняемого файла (*.exe) игры, подробнее см. ниже.

DPI-режим программ в Windows

К программам и играм, не объявленным как совместимые с HiDPI (DPI-aware), Windows автоматически применяет DPI-виртуализацию (DPI scaling). При DPI-виртуализации интерфейс программы увеличивается как растровое (точечное) изображение с коэффициентом, соответствующим системному масштабу. Например, при системном масштабе 200% такие программы увеличиваются вдвое по горизонтали и вдвое по вертикали.

Чтобы предотвратить размытие или пикселизацию из-за DPI-виртуализации в играх, важно убедиться, что игра работает в HiDPI-совместимом (DPI-aware) режиме. Определить это легко: размер окна игры в физических пикселах (точках) должен соответствовать разрешению, выбранному в настройках игры. Например, окно игры, работающей в разрешении Full HD, при системном масштабе 200% на 4K-мониторе должно занимать не весь экран, а примерно четверть экрана (половину по горизонтали и половину по вертикали).

Для игр, формально несовместимых с HiDPI, требуется отключить DPI-виртуализацию (DPI scaling) для исполняемого файла игры, чтобы окно игры имело правильный размер и было свободно от размытия, возможного вследствие масштабирования, которое Windows автоматически применяет к HiDPI-несовместимым приложениям.

Отключить DPI-виртуализацию для отдельно взятой игры можно в свойствах (пункт «Свойства» контекстного меню файла) её исполняемого файла (*.exe):

Windows 10
Пункт «Свойства» → вкладка «Совместимость» → секция «Параметры» → кнопка «Изменить параметры высокого DPI» → секция «Переопределение масштабирования с высоким разрешением» → галка «Переопределите режим масштабирования высокого разрешения. Масштабирование выполняется» → пункт «Приложение» выпадающего списка.
Windows 10 (устаревшие версии)
Пункт «Свойства» → вкладка «Совместимость» → секция «Параметры» → галка «Переопределите режим масштабирования высокого разрешения. Масштабирование выполняется» → пункт «Приложение» выпадающего списка.
Windows 7
Пункт «Свойства» → вкладка «Совместимость» → секция «Параметры» → галка «Отключить масштабирование изображения при высоком разрешении экрана».

Для некоторых игр, не объявленных как DPI-aware, Windows отключает DPI-виртуализацию автоматически. Обычно это происходит при первом переключении из полноэкранного режима в оконный.

Телевизоры

  • Есть информация, что некоторые 4K-телевизоры Panasonic поддерживают возможность вывода Full-HD-сигнала без размытия. Например, в модели TX-55CX802B это реализуется параметром «1080p Pixel by 4 pixels» в меню «Picture → Option Settings». Судя по всему, эта возможность касается исключительно разрешения Full HD (1920×1080) и не работает при иных разрешениях входного видеосигнала (например, 1280×720). При этом аналогичная модель меньшей диагонали — TX-50CX802 — судя по официальной инструкции, такой функции лишена. Функция также доступна в моделях TH-65AX900A, TX-50AX802 и TX-58DX750.
  • По некоторым данным, функция масштаби­рования без размытия доступна в режиме «Graphics» в некоторых моделях 4K-телевизоров Sony — например, X900E.

Прочее

  • Для отключения неоправданного размытия изображений на веб-страницах — расширение SmartUpscale для браузеров Firefox и Chrome.
  • Есть сведения, что размытие отсутствует при масштаби­ровании с целочис­ленными коэффи­циентами средствами официального видеодрайвера Intel для операционной системы Linux.
  • Операционная система Raspbian для мини-компьютеров Raspberry Pi начиная с  поддерживает масштаби­рование без размытия с коэффи­циентом 200% с помощью параметра настроек «Pixel Doubling» на вкладке «System» в приложении «Raspberry Pi Configuration».

Потенциальные решения

Аппаратные

  • Масштабирование средствами монитора. Преимущество по сравнению с масштаби­рованием средствами видеодрайвера — экономия пропускной способности видеоинтерфейса и потенциальное снижение электромагнитного излучения от сигнального кабеля.
  • Устройство для масштаби­рования, подключаемое в разрыв между источником видеосигнала и дисплеем. Преимущество по сравнению с масштаби­рованием средствами видеодрайвера — возможность использования с любым источником сигнала (например, игровой приставкой или видеоплеером), а не только компьютером. Потенциальные недостатки:

    • может вносить дополнительную задержку (lag);
    • может пострадать совместимость с технологией HDCP, необходимой для воспроизведения защищённого контента. Решаемо с помощью переключателя для временного включения режима прямой передачи видеосигнала без изменений. Переключатель может быть физическим или управляемым с компьютера по USB.

    Существуют похожие устройства:

    • mCable — HDMI-кабель со встроенной микросхемой для повышения качества входного сигнала в реальном времени с применением шумоподавления, сглаживания и повышения резкости с заявленной задержкой (лагом) менее 1 мс;

    • DCHDMI для вывода видеосигнала игровой приставки Sega Dreamcast по HDMI в формате Full HD с поддержкой целочис­ленного масштаби­рования с двукратным увеличением изображения (640×480 → 1280×960);
    • UltraHDMI для вывода видеосигнала игровой приставки Nintendo 64 по HDMI без потерь качества (обзор).

    Возможно, подобное устройство можно реализовать на основе программируемых вентильных матриц FPGA: 1, 2.

Программные

  • Масштабирование средствами видеодрайвера.
  • Изменение архитектуры видеодрайверов в операционной системе Windows таким образом, чтобы у ОС был доступ к изображению экрана в любой момент времени вне зависимости от способа формирования этого изображения. Тогда масштаби­рование без размытия могла бы осуществлять сама ОС.
  • Программный эмулятор монитора, перехватывающий подлежащее выводу на монитор изображение, масштабирующий его и выводящий отмасштабированное изображение на физический монитор.
  • Реверс-инжиниринг (reverse engineering) существующих видеодрайверов с целью активации возможности масштаби­рования в бОльшую сторону помимо уже существующего масштаби­рования в меньшую сторону в уже существующей функции nVidia DSR или AMD VSR.

Что делать

Обычные пользователи

  • Подпишитесь под петицией на Change.org о реализации целочис­ленного масштаби­рования без размытия в видеодрайверах.
  • Проголосуйте за добавление функции «GPU Integer scaling support» в видеодрайвер AMD. Регистрация не требуется.
  • Выразите свою поддержку в соответствующих существующих темах форумов nVidia, AMD, Intel.
  • Пожалуйтесь на размытие при масштаби­ровании средствами видеодрайвера в техническую поддержку производителей графических процессоров: nVidia, AMD, Intel (1, 2).
  • Пожалуйтесь на размытие при масштаби­ровании в техническую поддержку производителя вашего монитора или телевизора.
  • Спрашивайте о поддержке масштаби­рования без размытия в коммен­тариях к обзорам видеокарт, мониторов и телевизоров в СМИ.
  • Расскажите о проблеме размытия как можно большему количеству людей, указав ссылки на петицию и эту статью.

Разработчики игр

  • Встройте целочис­ленное масштаби­рование в разрабатываемые вами игры. В трёхмерных (3D-) играх это можно реализовать с помощью рендеринга в текстуру (Render To Texture) с последующим её масштаби­рованием аппаратными средствами видеокарты с использованием алгоритма «По соседним» («Nearest Neighbour»). В игровом движке Unreal Engine доступна встроенная возможность масштаби­рования без размытия с помощью консольной переменной r.Upscale.Quality со значением 0.
  • Лоббируйте встраивание целочис­ленного масштаби­рования в популярные игровые движки Unity, CryEngine и проч., чтобы автоматически сделать эту функцию доступной в будущих играх на их основе.

Алгоритм

Готовый алгоритм реализации целочис­ленного масштаби­рования без размытия. Алгоритм — последовательность действий для достижения нужного результата.

Описание

  1. Делим ширину SW и высоту SH экрана в физических пикселах соответственно на ширину W и высоту H подлежащего масштабированию изображения, получаем соответственно соотношения RW и RH.
  2. Если коррекция соотношения сторон изображения не требуется (пикселы квадратные, масштабные коэффициенты по горизонтали и вертикали одинаковы):

    1. Отбрасываем дробную часть у меньшего из соотношений RW и RH, получаем целочисленный масштабный коэффициент R.
    2. Отображаем каждый пиксел исходного изображения как квадратную группу из R×R физических пикселов одинакового цвета, равного цвету пиксела исходного изображения.
    3. Вычисляем ширину UW и высоту UH отмасштабированного изображения умножением соответственно ширины W и высоты H исходного изображения на масштабный коэффициент R.
  3. Если коррекция соотношения сторон изображения требуется (пикселы прямоугольные, масштабные коэффициенты по горизонтали и вертикали разные):

    1. Отбрасываем дробную часть у соотношений RW и RH, получаем максимальные целочисленные коэффициенты MRX по горизонтали и MRY по вертикали соответственно.
    2. Умножаем ширину W и высоту H изображения на MRX и MRY соответственно, получаем ширину MW и высоту MH области, в которую будет вписано отмасштабированное изображение.
    3. Делим ширину MW этой области на её высоту MH, получаем соотношение сторон MA этой области.
    4. Если соотношение MA равно целевому соотношению сторон TA:

      1. Масштабные коэффициенты RX по горизонтали и RY по вертикали принимаем равными MRX и MRY соответственно.
      2. Переходим к центрированию отмасштабированного изображения (шаг 4.1).
    5. Если соотношение MA меньше целевого соотношения сторон TA:

      1. Масштабный коэффициент RX по горизонтали принимаем равным MRX.
      2. Делим максимальную ширину MW на целевое соотношение сторон TA, получаем приблизительную отмасштабированную высоту AUH.
    6. Если соотношение MA больше целевого соотношения сторон TA:

      1. Масштабный коэффициент RY по вертикали принимаем равным MRY.
      2. Умножаем максимальную высоту MH на целевое соотношение сторон TA, получаем приблизительную отмасштабированную ширину AUW.
    7. Приблизительный отмасштабированный размер AUW или AUH делим на исходный размер изображения W или H по этой же оси.

      1. Если дробная часть полученного значения не равна 0,5, округляем до ближайшего целого числа.
      2. В противном случае округляем в направлении, при котором погрешность соотношения сторон минимальна. Если погрешности в обоих направлениях одинаковы, округляем в направлении, при котором соотношение сторон ближе к исходному.

      Полученное целое число — масштабный коэффициент по этой оси — RX (по горизонтали) или RY (по вертикали).

    8. Вычисляем ширину UW и высоту UH отмасштабированного изображения умножением ширины W и высоты H исходного изображения на масштабные коэффициенты RX по горизонтали и RY по вертикали соответственно.
  4. Выравниваем отмасштабированное изображение по центру экрана:

    1. Из ширины SW и высоты SH экрана вычитаем соответственно ширину UW и высоту UH отмасштабированного изображения, результаты делим на 2, отрасываем дробную часть, полученные числа обозначаем X и Y соответственно.
    2. Отмасштабированное изображение выводим на расстоянии X по горизонтали и Y по вертикали от верхнего-левого угла экрана.
  5. Оставшееся экранное пространство вокруг отмасштабированного изображения заполняем чёрным цветом.

Пример без коррекции соотношения сторон

Требуется вывести изображение 640×480 (VGA) на экране 1920×1080 (Full HD):

1920 / 640 = 3
1080 / 480 = 2,25

2,25 меньше, чем 3. Отбрасываем дробную часть 0,25, получаем 2. Значит, выводим каждый пиксел исходного изображения как группу 2×2 физических пиксела.

Ширина и высота отмасштабированного изображения — 1280 (640 * 2) и 960 (480 * 2) соответственно. Значит, для центрирования на экране выводим отмасштабированное изображение на расстоянии 320 ((1920 - 1280) / 2) пикселов по горизонтали и 60 ((1080 - 960) / 2) пикселов по вертикали от верхнего-левого угла экрана.

Пример с коррекцией соотношения сторон

Требуется вывести изображение 400×254 с целевым соотношением сторон 4:3 на экране 3840×2160 (4K):

3840 / 400 = 9,6
2160 / 254 ≈ 8,5

Отбрасываем дробную часть у полученных соотношений, получаем максимальные целочисленные коэффициенты 9 по горизонтали и 8 по вертикали соответственно.

Умножаем ширину 400 и высоту 254 изображения на 9 и 8 соответственно, получаем ширину 3600 и высоту 2032 области, в которую будет вписано отмасштабированное изображение.

Соотношение сторон области 1,77 больше целевого соотношения сторон 4:3 (≈ 1,333). Поэтому:

  • масштабный коэффициент по вертикали принимаем равным 8;
  • умножаем максимальную высоту 2032 на целевое соотношение сторон 4:3 (≈ 1,333), получаем приблизительную отмасштабированную ширину 2709,333.

Делим 2709,333 на исходную ширину 400 изображения, получаем 6,773, округляем, получаем масштабный коэффициент 7 по горизонтали. Таким образом, размер пиксела — 7×8.

Ширина и высота отмасштабированного изображения — 2800 (400 * 7) и 2032 (254 * 8) соответственно. Фактическое соотношение сторон — около 1,378 ( (2800 / 2032)), погрешность относительно целевого соотношения 4:3 (≈ 1,333) — около 3,35%.

Для центрирования на экране выводим отмасштабированное изображение на расстоянии 520 ((3840 - 2800) / 2) пикселов по горизонтали и 64 ((2160 - 2032) / 2) пиксела по вертикали от верхнего-левого угла экрана.

Эталонная отрисовка

Изображения ниже показывают, как должны выглядеть результаты целочис­ленного масштаби­рования без размытия без коррекции соотношения сторон. При правильной реализации целочис­ленного масштаби­рования результаты масштаби­рования приведённых исходных изображений должны быть идентичны приведённым образцам отмасштабированных изображений.

Во избежание влияния искажений, вносимых веб-браузером, рекомендуется сохранить изображения на компьютер и просматривать их сторонней самостоятельной программой в масштабе 100%. Вы также можете скачать все изображения в виде единого архива (80 КБ).

Изображения Масштаб Чёрный фон Примечание
Исходное В масштабе Полный Целоч. Слева +
справа
Сверху +
снизу
320×240
qVGA, 4:3
3840×2160
4K UHD, 16:9
9
900%
480+480 0 Изображение на всю высоту, чёрный фон только слева/справа
640×480
VGA, 4:3
1920×1080
Full HD, 16:9
2,25
225%
2
200%
320+320 60+60
1280×720
HD, 16:9
1920×1080
Full HD, 16:9
1,5
150%
1
100%
320+320 180+180 Идентично режиму центрирования
1280×720
HD, 16:9
2560×1600
WQXGA, 16:10
2
200%
0 80+80 Изображение на всю ширину, чёрный фон только сверху/снизу
1920×1080
Full HD, 16:9
3840×2160
4K UHD, 16:9
2
200%
0 0 Разрешения кратны, поэтому чёрного фона нет

Пользовательский интерфейс

Введение

Простейший интерфейс для управления масштаби­рованием без размытия может быть представлен единственной галкой (флажком) «Предот­вращать размытие при масштаби­ровании», включающей целочис­ленное масштаби­рование без размытия.

Более гибкий вариант — раздельное управление размытием и целочис­ленностью масштаба. Тогда нужны две настройки:

  1. для отключения размытия вне зависимости от целочис­ленности или дробности масштабного коэффи­циента — в результате просто используется алгоритм «По соседним» вместо билинейной интерполяции;
  2. для использования строго целочис­ленных масштабных коэффи­циентов с целью предотвращения искажений изображения в режиме масштаби­рования без размытия.

Целочисленность имеет смысл в основном в сочетании с отсутствием размытия, поэтому второй параметр можно делать доступным только при выборе первого. Но для большей гибкости или упрощения технической реализации интерфейса они могут быть независимыми.

Каждая из двух настроек может быть представлена либо галкой, либо списком из двух взаимо­исключающих вариантов, один из которых выбран по умолчанию.

Галка + выбор переменности размера пиксела

Потенциально наиболее интуитивно-понятный пользовательский интерфейс мог бы содержать галку (флажок) «Предотвращать размытие при масштаби­ровании».

Включение галки включало бы алгоритм масштаби­рования «По соседним» и одно­временно делало бы доступной дополни­тельную настройку «Размер пиксела» с двумя вариантами на выбор:

одинаковый
(без искажений изображения, но возможны чёрные полосы вокруг изображения);
переменный
(максимальное использование площади экрана ценой некоторых искажений изображения).

Текст в скобках можно было бы отображать уменьшенным шрифтом или динамически отображать как подсказку, появляющуюся при наведении указателя мыши на соответ­ствующий вариант.

Раздельные настройки для фильтрации и целочис­ленного масштаба

Пользова­тельский интерфейс мог бы быть аналогичным интерфейсу RetroArch, в видео­настройках которого есть два булевых (вкл./выкл.) параметра:

  • «Билинейная фильтрация»;
  • «Целочисленный масштаб».

Первый параметр включает/выключает размытие, второй — включает/выключает исполь­зование исключительно целочис­ленных масштабных коэффи­циентов для идеального масштаби­рования без искажений изображения.

Такой интерфейс допускает сочетание размытия с целочис­ленным масштабом, но на практике это не имеет смысла.

Термины «билинейная фильтрация» и «целочис­ленный масштаб» могут быть недостаточно понятны непродвинутым пользователям.

Два новых пункта в линейном списке режимов масштабирования

Можно добавить два новых пункта в существующий список класси­ческих режимов масштаби­рования («По центру», «Растянуть», «Растянуть с сохранением соотношения сторон»):

  • «Предотвращать размытие (максимальное использование экрана, возможны искажения)»;
  • «Предотвращать размытие и искажения (возможны чёрные полосы вокруг изображения)».

Этот вариант пользовательского интерфейса представляет собой компромисс между понятностью для пользователя и простотой технической реализации интерфейса.

Вопросы и ответы

Это то же самое, что «Nearest Neighbour»?

Лишь частично. Результаты применения алгоритма «Nearest Neighbour» («По соседним», «Ближайший сосед») и целочис­ленного масштаби­рования одинаковы только при целочисленных масштабных коэффи­циентах — например, 2 или 3.

  • При дробных масштабных коэффи­циентах (например, 4,5 при масштаби­ровании 640×480 до 4K) «Nearest Neighbour» приводит к искажению изображения.
  • При целочис­ленном масштаби­ровании масштабный коэффи­циент всегда целочис­ленный (например, ровно 4 для случая 640×480→4K) — вне зависимости от соотношения физического и логического разрешений. Пространство, которое может остаться пустым из-за некратности разрешений, заполняется чёрным, как в режиме центрирования.
Чем это отличается от DSR/VSR?

DSR/VSR и целочис­ленное масштаби­рование изменяют размер изображения в разных направлениях, разными способами и с разными целями.

  • При использовании DSR/VSR изображение отрисо­вывается в разрешении выше физиче­ского разрешения дисплея и затем умень­шается (downscaling) до разрешения дисплея. По сути это просто сглаживание методом SuperSampling (SSAA), которое можно использовать в играх, не имеющих встроенной поддержки сглаживания этого типа.
  • При целочис­ленном масштаби­ровании изображение отрисовывается в разрешении ниже физиче­ского разрешения дисплея и затем увеличи­вается (растягивается) (upscaling) без размытия до разрешения, не превышающего разрешение дисплея при максимально возможном целочис­ленном масштабном коэффициенте.

Единственное, что объединяет DSR/VSR и целочис­ленное масштаби­рование — универсальная виртуа­лизация разрешения, прозрачная для опера­ционной системы и программ и совместимая со всеми полноэкранными программами.

Чем это отличается от «Resolution Scaling»?
Функция «Resolution Scaling» (масштаби­рование разрешения), доступная в некоторых играх, предназначена для управления масштабом встроенными средствами игры. В отличие от исполь­зования одного из предопре­делённых разрешений, она позволяет более тонко подбирать сочетание детализации и быстродействия: например, если при разрешении 2560×1440 быстродействие недостаточно, а при 1920×1080 — избыточно, то можно выбрать в игре разрешение 2560×1440 и с помощью «Resolution Scaling» уменьшить его, например, до 2400×1350. В подавляющем большинстве игр эта функция работает с размытием даже при целочис­ленном коэффи­циенте масштаби­рования разрешения. Целочис­ленное масштаби­рование без размытия свободно от потерь качества, вызываемых размытием, и при правильной реализации должно быть совместимо со всеми полноэкранными программами.
Чем это отличается от шахматного рендеринга?
Как и использование меньшего разрешения, метод отрисовки «Checkerboard Rendering» (шахматный рендеринг) позволяет повысить быстродействие. Но к масштаби­рованию шахматный рендеринг отношения не имеет: трёхмерная сцена отрисо­вывается в половинном разрешении путём просчёта пикселов, расположенных в шахматном порядке, затем цвета недостающих пикселов вычисляются усреднением цветов соседних пикселов. Такой подход подобен чересстрочной развёртке, обычно используемой в телевещании для кодирования видео, и позволяет в играх добиться качества, близкого к таковому при отрисовке в полном разрешении (например, 4K), но с почти вдвое более высоким быстродействием. При целочис­ленном масштаби­ровании без размытия полноценно просчитываются все пикселы изображения, которое затем увеличи­вается без внесения в него каких-либо изменений и вычисления каких-либо усреднённых цветов.
Чем это отличается от повышения резкости (sharpening)?
Целочис­ленное масштаби­рование без размытия не имеет отношения к повышению контурной резкости (sharpening). Целочис­ленное масштаби­рование предотвращает потери качества, обусловленные размытием, а повышение резкости призвано повысить разборчивость уже размытого изображения.
Имеется в виду отключение сглаживания?
Нет. Размытие не имеет отношения к сглаживанию (antialiasing). Сглаживание применяется при отрисовке (рендеринге) трёхмерной сцены, а размытие добавляется при увеличении уже отрисо­ванного растрового изображения как набора точек. Целочис­ленное масштаби­рование можно (и следует) использовать в сочетании со сглажи­ванием. Вы включаете сглаживание в игре, выключаете размытие при масштаби­ровании в видео­драйвере и получаете изображение Full HD на 4K-мониторе с таким же качеством, как на мониторе с физическим разрешением Full HD.
Но ведь без размытия пикселы будут заметны?

Это не всегда так, а когда так — не обязательно плохо.

  • Заметность пикселов зависит от сочетания разрешения дисплея, разрешения исходного изображения и расстояния до экрана. Например, в разрешении Full HD на 4K-мониторе диагональю 24″ на типичном расстоянии 50-60 см от экрана логические пикселы почти неразличимы, и размытие лишь бессмысленно снижает резкость. Теперь представьте себе масштабирование 4K в 8K или 8K в 16K в тех же условиях.
  • Уместность заметной пикселизации зависит от типа исходного изображения: например, для пиксельной графики (pixel art) пикселизация — задуманный эффект, и размытие искажает авторский замысел.
Это только для пиксельной графики, эмуляторов и старых игр?
Нет. Другой важнейший сценарий использования целочис­ленного масштаби­рования — повышение быстродействия в современных трёхмерных играх в разрешении Full HD на 4K-мониторе без связанных с размытием потерь качества по сравнению с мониторами с физическим разрешением Full HD.
Но мне нравится размытие!
Без проблем. Целочис­ленное масштаби­рование задумано как включаемо-выключаемая (опциональная) функция. Если вам нравится размытие, вы сможете просто не включать целочис­ленное масштаби­рование в настройках видео­драйвера или дисплея.
Разве в OpenGL и DirectX это не встроено?
В программных интерфейсах отрисовки трёхмерной графики типа OpenGL (режим GL_NEAREST) и DirectX алгоритм «Nearest Neighbour» действительно доступен, но предназначен для масштаби­рования текстур. Хотя разработчики отдельно взятой игры могут косвенно использовать эту возможность для целочис­ленного масштаби­рования в конкретной игре, масштаби­рование текстур не имеет прямого отношения к универ­сальному полно­экранному масштаби­рованию, прозрачному для операционной системы и программ.
Зачем 4K-монитор, если играть всё равно в Full HD?
  • Компьютеры используются не только для игр:

    • комфорт при любой работе с текстом (просмотр веб-страниц, текстовые редакторы, программирование, веб-разработка), схемами, чертежами, графиками на 4K-мониторе несоизмеримо выше, чем на FHD-мониторе, благодаря увеличенной детализации, невидимой межпиксельной сетке и значительно сниженному «мельтешащему» попеременному мерцанию субпикселов;
    • более высокое физическое разрешение позволяет с более высоким качеством просматривать фотографии;
    • более высокое физическое разрешение позволяет увеличить глубину (разрядность) цвета без мерцания — путём отображения усреднённых оттенков с помощью соседних пикселов, отображающих слегка разные оттенки.
  • Даже если компьютер достаточно быстр для запуска игр в разрешении 4K, не все игры работают в этом разрешении правильно: например, в «Cities XL Platinum» элементы управления становятся слишком мелкими, а в «Bionic Commando Rearmed» не видны элементы головоломок на мини-уровнях «Hack enemy network».
  • Чем выше физическое разрешение, тем полнее может исполь­зоваться экран при целочис­ленном масштаби­ровании. Например, при масштаби­ровании 320×240 до Full HD теряется (заполняется чёрным) 1/9 (11%) высоты экрана (1080/240 = 4,5), а на 4K-дисплее коэффи­циент составляет ровно 9, и изображение занимает всю высоту экрана. На 8K-дисплеях то же будет применимо к разрешению 640×480; кроме того, можно будет без потерь качества или экранного пространства использовать любое из типичных разрешений: HD (1280×720, 6x), FHD (1920×1080, 4x), QHD (2560×1440, 3x), 4K (3840×2160, 2x).
Разве это не задача дисплея?
Ложное противо­поставление. Поддержка масштаби­рования видео­драйвером не противоречит поддержке со стороны дисплея, и наоборот. Даже если новые дисплеи начнут поддерживать масштаби­рование без размытия, владельцам существующих дисплеев это не поможет, а масштаби­рование средствами видео­драйвера — поможет.
Разве это не задача операционной системы?
У Windows нет доступа к содержимому экрана в реальном (exclusive) полно­экранном режиме. Для возможности реализации полно­экранного масштаби­рования средствами Windows нужно было бы принци­пиально изменить модель видео­драйверов Windows (WDDM), и даже в этом случае не исключалась бы дополни­тельная задержка (lag) по сравнению с масштаби­рованием собственными средствами видеодрайвера.
Не лучше ли использовать DLSS?

Метод DLSS не является универсальным решением:

  • доступен только на современных видеокартах nVidia;
  • требует индивидуальной поддержки со стороны каждой конкретной игры;
  • может приводить к разнообразным непредсказуемым артефактам изображения;
  • предназначен для трёхмерных игр и неприменим к играм других типов — например, основанным на пиксельной графике (pixel art).
А если источник сигнала — не компьютер?
Да, источником сигнала для дисплея не обязательно является компьютер, это может быть, например, игровая приставка или видеоплеер, выводящий видеосигнал в фиксиро­ванном разрешении HD или FHD. В таких случаях масштаби­рование средствами видео­драйвера бессильно, и необходимо масштаби­рование средствами самого дисплея. Но это никак не умаляет важность сценариев исполь­зования масштаби­рования средствами видео­драйвера.

Прогресс

Мониторы — анонсировано для EVE Spectrum

Поддержка целочис­ленного масштаби­рования без размытия планируется в компью­терном мониторе, разраба­тываемом в рамках проекта EVE Spectrum с учётом обратной связи от сообщества.

Такое масштабирование планируется включить по умолчанию, о чём сказано в разделе «Feature requests» на странице обновлённых технических характеристик от .

Первая модель монитора будет иметь разрешение 2560×1440 (QHD) при диагонали 27″. ЖК-матрица — LG 27GL850 типа «Nano IPS» со временем отклика 1 мс и частотой обновления до 165 Гц. Поддер­живается технология переменной частоты обновления (variable refresh rate, VRR) «FreeSync 2» с минимальной частотой 48 Гц.

Ориентировочный срок выпуска монитора — 1-й или 2-й квартал .

Intel — поддержка для процессоров Ice Lake (Gen10)

Анонс и статья

Поддержка полно­экранного целочис­ленного масштаби­рования без размытия доступна в видео­драйвере Intel для Windows начиная с бета-версии 25.20.100.7155 (). Стабильная версия 26.20.100.7212 вышла . Изначально поддержку возможности Intel анонсировала . на сайте Intel опубликовали статью с подробностями.

Функция доступна с помощью параметра «Retro Scaling» в программе «Центр управления графикой Intel» (Intel Graphics Command Center). У параметра три возможных значения:

  • Off
  • Scaled width
  • Fixed width

«Scaled width» означает исполь­зование алгоритма масштаби­рования «По соседним», а значение «Fixed width» соответ­ствует сочетанию алгоритма «По соседним» с исполь­зованием только целочис­ленных масштабных коэффи­циентов для предот­вращения искажений — т. е. собственно целочис­ленное масштаби­рование (integer scaling).

Системные требования

Требуется графическое ядро 11-го поколения (Gen11), которое будет исполь­зоваться в процессорах Intel 10-го поколения (Ice Lake). Выход первых процессоров Ice Lake ожидается в конце , первыми устройствами будут ноутбуки.

Для работы видеодрайвера Intel и программы «Центр управления графикой Intel» требуется операционная система Windows 10 версии 1709 или выше.

Аппаратная поддержка и быстродействие

Видеоядра Intel начиная с 11-го поколения имеют аппаратную поддержку алгоритма масштаби­рования «По соседним» («Nearest Neighbour»). Благодаря этому включение масштаби­рования без размытия средствами видеодрайвера Intel не будет оказывать отрицательного влияния на быстродействие.

В видеоядрах Intel предыдущих поколений (10-го и ниже) аппаратная поддержка «Nearest Neighbour», пригодная для полно­экранного масштаби­рования, отсутст­вовала. Поэтому поддержка возможности для них была бы возможна только на чисто программном уровне, из-за чего реализация была бы нетривиальной, а быстродействие — низким.

Алгоритмы

Доступны оба варианта масштаби­рования без размытия:

  • масштабирование с целочисленным коэффи­циентом, одинаковыми размерами пикселов и без искажений изображения, но с возможными чёрными полосами вокруг изображения;
  • алгоритм «По соседним» с максимально полным использованием площади экрана ценой некоторых искажений изображения из-за неодинаковых размеров соседних пикселов.

Их можно включить с помощью значений «Fixed width» и «Scaled width» параметра «Retro Scaling» соответственно.

Минимальное разрешение

Минимальное разрешение, которое будет поддерживаться первой реализацией — 640×480. Поддержка более низких или заданных пользователем разрешений может появиться в последующих версиях графического ПО Intel.

nVidia — поддержка в драйвере 436.02 для поколения Turing под Windows 10

Поддержка целочис­ленного масштаби­рования доступна в Windows-драйвере nVidia начиная с версии 436.02 от 20 августа 2019 года, но только при использовании видеокарт nVidia поколения Turing (RTX и GTX 16*) и только в Windows 10 начиная с версии 1803 (Redstone 4) от апреля 2018 года. Под Windows 7 функция недоступна, хотя сам драйвер доступен. Текущая реализация позицио­нируется как экспери­ментальная и имеет бета-статус.

Функция также доступна в видеодрайвере для профессиональных видеокарт nVidia Quadro начиная с версии R440 U1 (440.97) ().

Функция включается выбором пункта «Целочис­ленное масштаби­рование» («Integer scaling») в списке «Дисплей» → «Регулировка размера и положения рабочего стола» → «Масштаби­рование» → «Выберите режим масштаби­рования» («Display» → «Adjust desktop size and position» → «Scaling» → «Select a scaling mode») в панели управления nVidia. При этом для масштаби­рования средствами видеокарты необходимо выбрать пункт «ГП» («GPU») в выпадающем списке «Выполнить масштабирование на» («Perform scaling on»).

Ограничения

Функция недоступна:

  • в режиме «Surround»;
  • при объединении нескольких дисплеев (tiled displays);
  • при использовании пользова­тельских разрешений;
  • при цветовой субдискретизации 4:2:0 (YUV420) (поддерживаемые цветовые форматы: RGB, YUV444, YUV422);
  • при активной функции DSR;
  • при активной функции повышения резкости nVidia Image Sharpening (441.08+, );
  • на ноутбуках с гибридной (MSHybrid) графической подсистемой (встроенное графическое ядро + дискретная видеокарта), в которых настройками экрана управляет встроенное графическое ядро. По некоторым данным, одним из таких ноутбуков является MSI GS65 Stealth 9SG, сочетающий видеоядро Intel UHD Graphics 630, встроенное в процессор Intel i7-9750H, и мобильную дискретную видеокарту nVidia GeForce RTX 2080.

Кроме того, согласно примечаниям к выпуску (release notes), смена разрешения при сочетании режима целочис­ленного масштаби­рования с режимом расширенного динами­ческого диапазона (HDR) может приводить к «падению» системы («синему экрану смерти», или BSOD) или зависанию компьютера.

Согласно nVidia, несовместимость с HDR и пользовательскими разрешениями — непреодолимое фундаментальное ограничение программируемого фильтра, использованного для реализации целочисленного масштабирования, и это невозможно исправить как минимум для видеокарт nVidia поколения Turing. Представители nVidia говорят, что целочисленное масштабирование невозможно задействовать параллельно с так называемым Scan Out Compositor, используемым, например, для реализации DSR или пользовательских разрешений.

Недоступно для видеокарт предыдущих поколений

Для видеокарт предыдущих поколений в Windows-версии драйвера nVidia GeForce функция недоступна. 25 марта 2019 года представитель nVidia сообщил, что реализация масштаби­рования без размытия в видеодрайвере для Windows не планируется, признав при этом, что сам алгоритм тривиален.

В качестве причины называется невозможность такой реализации, которая не потребовала бы постоянного сопровождения («ongoing continuous support») на фоне регулярных изменений WDDM-спецификации видеодрайверов в Windows 10.

При этом представители nVidia игнорируют вопросы о том, не требует ли такого же постоянного сопровождения существующая технология DSR, тоже реализующая виртуализацию разрешения, прозрачную для операционной системы и полноэкранных программ.

nVidia — ограниченная поддержка в Linux-драйвере

В видеодрайвере nVidia GeForce для операционных систем Linux, Solaris и FreeBSD начиная с версии 384.47 () доступен алгоритм масштаби­рования «По соседним»Nearest Neighbour») в рамках функциональности фильтров трансформации (transform filter). Включается командой следующего вида:

nvidia-settings -a CurrentMetaMode="DP-1: 3840x2160_60 {ViewPortIn=1920x1080, ViewPortOut=3840x2160, ResamplingMethod=Nearest }"

где:

  • DP-1 — видеовыход, к которому подключён монитор;
  • 3840x2160 — разрешение сигнала, получаемого монитором; должно быть равно физическому разрешению монитора, иначе будет размытие из-за масштаби­рования средствами монитора;
  • ViewPortIn — размер области отрисовки (рендеринга) в логических точках (пикселах);
  • ViewPortOut — размер изображения в физических точках после масштабирования;
  • ResamplingMethod — алгоритм масштаби­рования (значение по умолчанию — Bilinear).

Результат масштаби­рования может быть меньше физического разрешения монитора. Например, для вывода изображения размером 1280×720 с двукратным увеличением (пикселами 2×2) по центру экрана монитора с физическим разрешением 3840×2160 нужна следующая команда:

nvidia-settings -a CurrentMetaMode="DP-1: 3840x2160_60 {ViewPortIn=1280x720, ViewPortOut=2560x1440+640+360, ResamplingMethod=Nearest }"

где 640 и 360 — сдвиги в физических пикселах от верхнего левого угла по горизонтали и вертикали соответственно, необходимые для центрирования отмасштабированного изображения.

Команды можно исполнить в терминале, который можно открыть сочетанием клавиш Ctrl+Alt+T.

Программная реализация и быстродействие

На аппаратном уровне в видеокартах nVidia реализована только билинейная интерполяция с размытием, поэтому алгоритм масштаби­рования «По соседним» реализован программно и задействует часть вычислительных ресурсов графического процессора. Теоретически это может несколько снизить максимальное быстродействие видеокарты. На практике быстродействие примерно одинаково вне зависимости от типа интерполяции: «По соседним» (Nearest) или билинейная (Bilinear).

К сожалению, в некоторых играх к серьёзному падению быстродействия приводит сам факт использования фильтра трансформации. Например, в игре «F1 2017» в разрешении 1280×720 при использовании фильтра трансформации быстродействие ниже, чем в разрешении 1920×1080 в обычном полноэкранном режиме. При масштаби­ровании игры при её работе в оконном режиме быстродействие заметно выше, чем при полноэкранном масштаби­ровании средствами фильтра трансформации, но всё равно ниже, чем в обычном полноэкранном режиме.

Только оконные и псевдополноэкранные игры

К сожалению, функция работает только с оконными и псевдополноэкранными (выводимыми поверх рабочего стола ОС) играми. К реально полноэкранным играм, переключающим разрешение монитора (например, «Euro Truck Simulator 2») масштаби­рование не применяется.

При этом во многих псевдополноэкранных играх функция работает неправильно: изображение отрисовывается в разрешении, выбранном в настройках игры (например, 1920×1080), затем масштабируется с размытием до разрешения ViewPortOut (например, 3840×2160), затем из него вырезается верхняя-левая или нижняя-левая часть, соответствующая размеру ViewPortIn (например, 1920×1080), и лишь эта часть выводится на монитор.

Проблема не зависит от конкретного окружения рабочего стола (desktop environment) и проявляется как минимум в Unity (Ubuntu 17.04) и GNOME (Ubuntu 17.10).

Чтобы при работе в оконном режиме была видна максимально возможная часть полезного пространства окна игры, можно включить автоматическое скрытие панели задач (Dock) в настройках Ubuntu (Параметры → Панель задач → Автоматически скрывать панель задач), а для автоматического скрытия верхней панели использовать GNOME-расширение Hide Top Bar. Для минимизации высоты заголовочной панели окна игры имеет смысл переключиться на системный масштаб 100%.

Мышь и разрешение

Сопутствующая проблема — даже если результат отрисовки игры виден целиком, её меню, кнопки и другие элементы управления могут быть недоступны для наведения указателя и щелчков мышью, если не переключиться на нужное логическое разрешение (ViewPortIn) в настройках игры до включения Nearest-режима в видеодрайвере.

Это связано с тем, что по умолчанию игра может запускаться в выходном (ViewPortOut) разрешении видеодрайвера вместо логического (ViewPortIn). Это же может приводить к серьёзному снижению быстродействия: игра будет сначала отрисовываться в высоком разрешении, затем масштабироваться в низкое, а затем — снова в высокое с интерполяцией «По соседним».

Официальные комментарии nVidia

Один из разработчиков Linux-драйвера Аарон Платтнер (Aaron Plattner) считает, что проблема не в драйвере, а в том, что игры неправильно трактуют данные, предоставляемые программной подсистемой RandR.

Он признаёт, что, учитывая количество неправильно работающих игр, имело бы смысл универсальное решение, не зависящее от конкретной игры. В качестве возможной реализации такого решения он упоминает гипотетическую LD_PRELOAD-библиотеку, которая могла бы перехватывать вызовы функций библиотеки libXrandr и подменять результаты. При этом он не сообщает, планирует ли сама nVidia разрабатывать и распространять такое решение вместе с видеодрайвером.

Проверенные игры

В таблице — результаты проверки некоторых игр в виртуальном разрешении Full HD (1920×1080) на мониторе Dell P2415Q с физическим разрешением 4K (3840×2160) в операционной системе Ubuntu версий 17.10 и 18.04.

AMD — включено в опрос, реализуется для Linux

Windows — включено в опрос

В видеодрайвере AMD для Windows целочис­ленное масштаби­рование без размытия недоступно. Но AMD включила эту функцию («GPU Integer scaling support») в список потенциально планируемых функций в официальном опросе, призванном помочь определить, какие из функций наиболее востребованы пользователями.

Учитывая, что Intel и nVidia уже реализовали масштаби­рование без размытия в видео­драйверах для Windows, поддержку со стороны AMD можно ожидать в конце 2019 года. Преимуществами Windows-реализации AMD на фоне конкурентов могли бы стать:

  • поддержка функции вне зависимости от поколения видеокарты;
  • поддержка Windows 7, почти столь же распространённой, как Windows 10.

Linux — работа по реализации для ядра 5.4

Идёт работа по реализации поддержки целочис­ленного масштаби­рования без размытия в рамках специфичную для графики AMD части ядра Linux находящейся в разработке версии 5.4, выпуск стабильной версии которой запланирован на конец 2019 года.

Судя по программному коду и описанию патча от , целочис­ленное масштаби­рование будет прозрачно исполь­зоваться в сущест­вующем режиме центрирования и как самосто­ятельный режим масштаби­рования доступно не будет. Работа по реализации начата .

Linux — ограниченная поддержка в XRandR

Системная Linux-программа XRandR для управления графической подсистемой позволяет включить масштаби­рование без размытия вне зависимости от производителя графического чипа. Функция доступна в экспериментальной версии, находящейся в разработке, и включается такой командой:

xrandr --output DP-1 --scale 0.5x0.5 --filter nearest

где:

  • DP-1 — условное обозначение видеовыхода, к которому подключён монитор;
  • 0.5 — понижающий коэффи­циент: например, 0.5 на 4K-мониторе (3840×2160) включит виртуальное разрешение Full HD (1920×1080);

Увидеть обозначение видеовыхода можно в панели управления видеокартой либо в списке, выводимом командой:

xrandr | grep " connected " | awk '{ print$1 }'

Последняя стабильная по состоянию на версия XRandR 1.5 поддерживает масштаби­рование, но не поддерживает параметр --filter, поэтому отключение размытия в ней недоступно. При попытке использования параметра --filter выводится такое сообщение об ошибке:

xrandr: unrecognized option '--filter'

Установка экспериментальной версии XRandR

Внимание: установка экспериментальных версий фундаментальных системных программ в Linux может повлиять на работо­способность всей системы, отдельных её функций или сторонних программ.

Установить экспериментальную версию XRandR можно такой последовательностью команд:

git clone git://anongit.freedesktop.org/xorg/app/xrandr xr
cd xr
./autogen.sh
sudo make install

Перед этим может потребоваться установить дополнительные пакеты или экспериментальные версии уже установленных пакетов. Например, в только что установленной Ubuntu 18.10 достаточно установить пакеты git, xorg-dev, xutils-dev, autoconf следующими командами:

sudo apt install git
sudo apt install xorg-dev
sudo apt install xutils-dev
sudo apt install autoconf

Только оконные и псевдополноэкранном игры

Совместимость с играми и ограничения аналогичны таковым у фильтров трансформации в Linux-драйвере nVidia: масштаби­рование возможно только для игр, работающих в оконном или псевдополноэкранном (borderless) режиме.

Некоторые игры в псевдополноэкранном режиме выводятся в усечённом виде: например, при внутриигровом разрешении Full HD на 4K-мониторе обычно видна нижняя левая или верхняя левая четверть изображения. В реальном (exclusive) полноэкранном режиме видна ещё меньшая часть изображения, т. к. не только часть исходного изображения масштабируется до физического разрешения монитора, но и монитор переключается в меньшее разрешение.