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

В двух словах

Проблема

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

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

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

Решение

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

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

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

Что делать

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

Подписать петицию


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

Масштабирование — это изменение размеров (разрешения) изображения. Оно необходимо, если физическое разрешение (количество точек по горизонтали и вертикали) монитора или телевизора отличается от разрешения подаваемого на него видеосигнала: например, если игра в разрешении 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 — слева и справа.

Коррекция соотношения сторон

Кроме того, алгоритм «По соседним» не предусматривает возможность коррекции соотношения сторон (aspect ratio) изображения. Такая коррекция нужна, например, для старых игр, рассчитанных на соотношение сторон 4:3, но зачастую использовавших уменьшенное по вертикали разрешение 320×200 вместо 320×240, или 640×400 вместо 640×480.

Примеры

Пиксель-арт

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

Фото

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

Демо

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

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

  • На 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).
  • Появляется возможность ещё полнее использовать площадь экрана путём использования логических пикселов с переменным размером с разницей в размере соседних пикселов в 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»);
  • в играх на основе пиксельной графики (pixel art) быстродействие не является проблемой, а важен пикселизованный характер изображения без неуместного размытия, не соответст­вующего замыслу авторов игры;
  • некоторые игры (например, «Duck Tales Remastered») имеют фиксированное разрешение (например, Full HD), а поддержка остальных разрешений достигается масштабированием с размытием;
  • если экраном повышенного разрешения оснащён ноутбук, установка мощной видеокарты практически невозможна из-за естественных ограничений по габаритам, энергопотреблению и тепловыделению.

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

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

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

  • В некоторые игры масштабирование без размытия встроено. Обычно это доступно только в современных 2D-играх на основе пиксельной графики (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) физических пикселов одинакового цвета.

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

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

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

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

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

  • DgVoodoo (эмулятор Glide и «обёртка» для DirectX 8 и ниже) и DXGL (OpenGL-реализация DirectDraw) поддерживают алгоритм масштабирования без размытия «По соседним» («Nearest Neighbour») (источники: 1, 2).
  • Возможность целочисленного масштабирования без размытия планируется добавить в Glide-эмулятор nGlide в одной из версий, следующих за 2.0.

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

  • Эмулятор 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 → Output → Blur Emulation, а параметр Settings → Shader установить в значение None вместо используемого по умолчанию Blur.
  • 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.
  • SNES-эмулятор Snes9x EX+ для Android начиная с версии 1.4.4 () поддерживает целочисленное масштабирование (Options → Video → Zoom → Integer-only). При этом для предотвращения размытия следует установить параметр Options → Video → Image Interpolation в значение None вместо используемого по умолчанию Linear.
  • Cemu — экспериментальный эмулятор игровой приставки Wii U для Windows — начиная с версии 1.15.2 () поддерживает алгоритм масштабирования «По соседним» («Nearest Neighbour») (Options → General settings → Graphics → Upscale filter / Downscale filter → Nearest Neighbor). Произвольное разрешение можно установить для каждой конкретной игры с помощью графических пакетов (Options → Graphic packs). Эмулятор формально несовместим с HiDPI (не является DPI-aware), поэтому для гарантии отсутствия размытия рекомендуется отключить DPI-виртуализацию в свойствах его исполняемого файла.
  • Оболочка 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 (по умолчанию). Но периодически изображение выводится с ошибочным соотношением сторон и искажёнными пропорциями пикселов.

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

  • Для запуска 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 (Вид → Настройки → Воспроизведение → Вывод → Интерполяция → Ближайший сосед). Ограничение: настройка применяется ко всем видео вне зависимости от кратности размеров видеокадра размеру окна программы и использования полноэкранного режима.

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

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

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

Телевизоры

  • Есть информация, что некоторые 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.

Прочее

  • Программа ScummVM, современная среда для запуска некоторых старых игр типа «Broken Sword», по умолчанию в полноэкранном режиме использует масштабирование «По соседним» («Nearest Neighbour»). В оконном режиме доступна также возможность вывода с фиксированными целочисленными масштабами 2x (200%) и 3x (300%) («Настройки → Графика → Граф. режим»), но глобальная настройка применяется только к играм с разрешением не более 320×240, а для игр с более высоким разрешением требуется задавать эту настройку с помощью индивидуального для игры набора настроек. Программа формально несовместима с HiDPI (не является DPI-aware), поэтому для гарантии отсутствия размытия рекомендуется отключить DPI-виртуализацию в свойствах её исполняемого файла. При дробных масштабных коэффициентах алгоритм «По соседним» приводит к искажениям, поэтому для игр, не требующих коррекции соотношения сторон, может иметь смысл использование ScummVM в оконном режиме в сочетании с целочисленным масштабированием с помощью программы IntegerScaler.
  • Для отключения неоправданного размытия изображений на веб-страницах — расширение SmartUpscale для браузеров Firefox и Chrome.
  • Есть сведения, что размытие отсутствует при масштабировании с целочисленными коэффициентами средствами официального видеодрайвера Intel для операционной системы Linux.
  • Операционная система Raspbian для мини-компьютеров Raspberry Pi начиная с  поддерживает масштабирование без размытия с коэффициентом 200% с помощью параметра настроек «Pixel Doubling» на вкладке «System» в приложении «Raspberry Pi Configuration».

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

Аппаратные

  • Масштабирование средствами монитора. Преимущество по сравнению с масштабированием средствами видеодрайвера — экономия пропускной способности видеоинтерфейса и потенциальное снижение электромагнитного излучения от сигнального кабеля.
  • Устройство для масштабирования, подключаемое в разрыв между видеокартой и монитором. Существует аналогичное устройство UltraHDMI для вывода видеосигнала игровой приставки Nintendo 64 на интерфейс HDMI без потерь качества (обзор). Возможно, устройство можно построить на основе программируемых вентильных матриц FPGA: 1, 2. Потенциальные недостатки:

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

Программные

  • Масштабирование средствами видеодрайвера.
  • Изменение архитектуры видеодрайверов в операционной системе 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. Делим ширину (A) и высоту (B) экрана в физических пикселах (точках) соответственно на ширину (C) и высоту (D) подлежащего масштабированию изображения.
  2. Выбираем меньшее из полученных соотношений.
  3. Отбрасываем дробную часть. Полученное целое число обозначаем E.
  4. Отображаем каждый пиксел исходного изображения как квадратную группу из E×E физических пикселов одинакового цвета, равного цвету пиксела исходного изображения. Ширина (F = C * E) и высота (G = D * E) отмасштабированного изображения в физических пикселах будут в E раз больше ширины (C) и высоты (D) исходного изображения соответственно.
  5. Выравниваем отмасштабированное изображение по центру экрана:

    1. из ширины (A) и высоты (B) экрана вычитаем соответственно ширину (F) и высоту (G) отмасштабированного изображения в физических пикселах, результаты делим на 2, отрасываем дробную часть, полученные числа обозначаем H и J соответственно;
    2. отмасштабированное изображение выводим на расстоянии H по горизонтали и J по вертикали от верхнего-левого угла экрана.
  6. Оставшееся экранное пространство вокруг отмасштабированного изображения заливаем чёрным цветом.

Пример

Например, требуется вывести изображение 640×480 на экране 1920×1080:

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) пикселов по вертикали от верхнего-левого угла экрана.

Прогресс

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

«По соседним» в Linux-драйвере nVidia

В видеодрайвере 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.

По совместимости с масштабированием без размытия средствами Linux-видеодрайвера nVidia GeForce можно условно разделить игры на три категории:

  • работают правильно;
  • видна часть изображения: например, при разрешении ViewPortIn, равном 1920×1080, и ViewPortOut, равном 3840×2160, видна нижняя-левая или верхняя-левая четверть;
  • сигнал выводится в реально полноэкранном режиме — напрямую на монитор, в обход масштабирования видеокартой, и масштабируется монитором с размытием.
Игра П О Примечание
Airline Tycoon Deluxe + Основана на 2D-движке и имеет фиксированное низкое разрешение с соотношением 4:3 или 5:4, но правильно масштабируется с сохранением пропорций, без размытия со стороны видеокарты, но с размытием движком игры. В настройках игры возможности изменить разрешение нет.
Amnesia: A Machine for Pigs + Изображение выводится напрямую на монитор, в обход масштабирования средствами видеокарты. В настройках максимально доступным является физическое разрешение вне зависимости от режима Nearest. Можно играть в оконном режиме.
Amnesia: The Dark Descent
Broken Sword 5 —
the Serpent’s Curse
+ В полноэкранном режиме по умолчанию («Fullscreen 1») изображение выводится напрямую на монитор, в обход масштабирования средствами видеокарты. В альтернативном полноэкранном режиме «Fullscreen 2» видна нижняя-левая часть изображения, при этом указатель мыши находится в узкой полосе наверху и сдвинуть его ниже невозможно, работает только управление клавиатурой (стрелки вверх-вниз и Enter). В полноэкранном режиме «Fullscreen 3» мышь не работает. Иногда в режимах «Fullscreen 2» и «Fullscreen 3» не реагирует ни на мышь, ни на клавиатуру. Иногда после переключения в режим Nearest при работающей игре, игра в режиме «Fullscreen 1» игра работает в псевдополноэкранном режиме без размытия. Можно играть в оконном режиме.
Borderlands 2 Видна только нижняя-левая часть изображения. В обычном полноэкранном режиме игра зависает в меню, поэтому неизвестно, поддерживается ли оконный режим.
Brütal Legend ~ По умолчанию выводится в физическом разрешении монитора, хотя изображение видно целиком. Во избежание падения быстродействия, следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере. На начальной заставке (перед видео) видна нижняя-левая часть даже при заранее выбранном в игре правильном разрешении.
Cities: Skylines ~ + По умолчанию выбрано физическое или системное разрешение (оно же является максимальным доступным), и видна только нижняя-левая часть изображения. После переключения игры в разрешение, соответствующее ViewPortIn, изображение становится видно целиком, но это работает, только если включать Transform-фильтр при уже запущенной игре. Можно играть в оконном режиме.
Day of Infamy + В настройках игры по умолчанию выбрано разрешение ViewPortIn, оно же является максимально доступным. В игре доступны три режима: «Full Screen», «Borderless» и «Windowed»; при включённом Transform-фильтре они работают аналогично. Загрузка любого уровня занимает 5-6 минут (безотносительно Transform-фильтра), большую часть этого времени процесс выглядит зависшим на отметке около 20%.
DiRT: Showdown + Видна только верхняя-левая часть изображения. Можно играть в оконном режиме.
Don’t Starve Together + Изображение выводится напрямую на монитор, в обход масштабирования средствами видеокарты. Можно играть в оконном режиме. По умолчанию запускается в оконном режиме с выбранным разрешением 640×480.
Dota 2 ~ По умолчанию интерфейс не реагирует на указатель мыши. Следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
Dungeons 2 +
Euro Truck Simulator 2 + Изображение выводится напрямую на монитор, в обход масштабирования средствами видеокарты. Можно играть в оконном режиме.
F1 2015 ~ В полноэкранном режиме видна только нижняя-левая часть изображения. В оконном режиме выводится по центру области, соответствующей физическому разрешению монитора, при этом указатель мыши скрыт при активном окне игры. Перетащить окно в видимую область можно так: сделать активным окно другой программы нажатием Alt+Tab, расположить его так, чтобы рядом с ним была видна хотя бы часть заголовочной панели игры, начать перетаскивание окна игры, не переключаясь перед этим на окно игры; но быстродействие в таком режиме значительно ниже, чем в обычном полноэкранном режиме.
F1 2017 ~ При полноэкранном масштабировании сильно падает быстродействие по сравнению с обычным полноэкранным режимом. В оконном режиме быстродействие заметно выше, но ниже, чем в обычном полноэкранном.
GRID Autosport ~ В полноэкранном режиме видна только нижняя-левая часть изображения. В оконном режиме выводится по центру области, соответствующей физическому разрешению монитора, при этом указатель мыши скрыт при активном окне игры. Перетащить окно в видимую область можно так: сделать активным окно другой программы нажатием Alt+Tab, расположить его так, чтобы рядом с ним была видна хотя бы часть заголовочной панели игры, начать перетаскивание окна игры, не переключаясь перед этим на окно игры; но быстродействие в таком режиме значительно ниже, чем в обычном полноэкранном режиме. На системах с региональными настройками, при которых разделителем целой и дробной частей чисел является не  точка, а запятая, игра зависает на начальной заставке с логотипом игры вне зависимости от использования режима масштабирования Nearest; зависание можно предотвратить переключением регионального числового формата на американский (Region & Language → Formats → United States).
Guns of Icarus Online +
Half-Life 2 ~ Пункты меню по умолчанию не реагируют на указатель мыши. Следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
Hexcells + В настройках игры по умолчанию выбрано разрешение ViewPortIn, оно же является максимально доступным. Оконный режим тоже поддерживается, но работает так же, как полноэкранный.
Hexcells Infinite
Hexcells Plus
Killing Floor ~ По умолчанию выводится в разрешении 800×600; при переключении на разрешение ViewPortIn видна только часть окна, причём эта часть занимает только часть области ViewPortIn. Поддерживает оконный режим, но в нижней скрытой части окна содержатся важные управляющие элементы (кнопки), необходимые для игры.
Left 4 Dead 2 ~ Видна только нижняя-левая часть изображения. Оба оконных режима — «Windowed (No Border)» и «Run in a window» — работают одинаково — с заголовочной панелью окна. Можно играть в оконном режиме, но иногда меню не реагирует на мышь.
Limbo Видна только нижняя-левая часть изображения (скриншот). Изменение разрешения и оконный режим в игре не предусмотрены.
Micron + По умолчанию запускается в оконном режиме в разрешении 640×480. Максимальным доступным разрешением в настройках игры является ViewPortIn. Если в обычном режиме (без режима Nearest) выбрать в настройках игры физическое разрешение, а потом запустить с масштабированием в режиме Nearest, то видна только нижняя-левая часть изображения.
Middle Earth: Shadow of Mordor ~ При включённом Transform-фильтре окна игры на экране не видно ни в полноэкранном, ни в оконном режиме. Чтобы играть в оконном режиме, включать Transform-фильтр нужно при уже запущенной игре, тогда оконный режим работает как полноэкранный. Если после этого переключить игру в полноэкранный режим, становится видна только нижняя-левая часть изображения.
Oddworld: New’n’Tasty +
Outlast ~ По умолчанию выводится в физическом разрешении монитора, хотя изображение видно целиком. Во избежание падения быстродействия, следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
Painkiller: Hell & Damnation
(демо-версия)
Видна только нижняя-левая часть изображения. Оконный режим в игре не предусмотрен.
Payday 2 ~ При использовании Transform-фильтра nVidia видна только нижняя-левая часть изображения. Но сама игра в Linux (но не в Windows) использует масштабирование без размытия при любом выбранном в игре разрешении, поэтому использование Transform-фильтра не требуется.
Portal ~ Меню недоступно для мыши.
Rogue Stormers + Изображение выводится напрямую на монитор, в обход масштабирования средствами видеокарты. Можно играть в оконном режиме.
Rush + В настройках игры возможности изменить разрешение нет, но игра правильно работает по умолчанию с масштабированием без размытия.
Sanctum 2 + Видна только нижняя-левая часть изображения. Можно играть в оконном режиме.
Satellite Reign + В настройках игры по умолчанию выбрано разрешение ViewPortIn, оно же является максимально доступным.
Shadow Tactics:
Blades of the Shogun

(демо-версия)
+ В настройках игры по умолчанию выбрано разрешение ViewPortIn, оно же является максимально доступным.
Shadow Warrior ~ По умолчанию выводится в физическом разрешении монитора, хотя изображение видно целиком. Быстродействие при этом значительно ниже, чем в разрешении ViewPortIn. Во избежание падения быстродействия, следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере. После переключения на другую программу и обратно становится видна только нижняя левая часть изображения.
Spec Ops: The Line ~ Видна только нижняя-левая часть изображения. Возможность играть в оконном режиме ограничена, т. к. в скрытой нижней части окна находятся критичные элементы управления, в том числе для начала кампании после выбора сложности.
Syder Arcade ~ По умолчанию видна только нижняя-левая часть изображения (скриншот). Следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
The Cave ~ По умолчанию выводится в физическом разрешении монитора, хотя изображение видно целиком. Во избежание падения быстродействия, следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
This War of Mine +
Torment: Tides of Numenera + При включённом Transform-фильтре игра работает заметно плавнее, чем при том же внутриигровом разрешении в обычном режиме. Оконный режим выглядит так же, как полноэкранный.
Trine Enchanted Edition Видна только нижняя-левая часть изображения (скриншот). Оконный режим в игре не предусмотрен.
Trine 2 +
Toki Tori + Основана на 2D-движке и имеет фиксированное разрешение, но правильно масштабируется без размытия со стороны видеокарты, но с размытием движком игры. В настройках игры возможности изменить разрешение нет.
Toki Tori 2 ~ Основана на 2D-движке и имеет фиксированное разрешение, но настройки разрешения есть, и по умолчанию выбрано физическое (Native) разрешение монитора. Правильно масштабируется без размытия со стороны видеокарты, но с размытием движком игры. Во избежание падения быстродействия, следует сначала переключить разрешение в игре, а потом включить масштабирование в Nearest-режиме в видеодрайвере.
Tyranny + Максимальным доступным разрешением в настройках игры является ViewPortIn.
X Rebirth (демо-версия) ~ + В режиме «Display Mode: Borderless Window», выбранном в игре по умолчанию, игра работает правильно, только самая первая заставка с логотипом видна частично, хотя при этом без размытия. В полноэкранном режиме («Fullscreen») видна только нижняя-левая часть изображения с размытием. В режиме «Borderless Window» разрешение изменить невозможно, оно всегда равно текущему разрешению ОС (либо ViewPortIn при включённом Transform-фильтре). Интерфейс реагирует на указатель мыши только в оконном («Windowed») режиме. В оконном режиме фактическое отображаемое в игре разрешение после его выбора оказывается по высоте меньше выбранного на высоту заголовочной панели окна (например, 1920×1050 вместо 1920×1080), т. е. теоретически внизу ничего не скрыто из-за заголовочной панели наверху.
XCOM 2 + В полноэкранном режиме видна только нижняя-левая часть изображения. В оконном режиме изображение заполняет весь экран, заголовочная панель окна отсутствует, выглядит как полноэкранный режим; в настройках игры при этом доступны разрешения вплоть до физического. При выборе в игре разрешения выше ViewPortIn видна верхняя-левая часть изображения. По быстро­действию оконный режим с масштабированием с помощью Transform-фильтра аналогичен обычному полноэкранному режиму. Быстродействие под Windows заметно выше.

В таблице используются следующие обозначения:

  • П — возможность играть без размытия в полноэкранном режиме;
  • О — возможность играть без размытия в оконном режиме;
  • + — игра работает нормально;
  •  — играть невозможно;
  • ~ — играть можно, но есть ограничения — см. примечание.

Недоступно в драйвере nVidia для Windows

В Windows-версии драйвера nVidia GeForce функция недоступна. 25 марта 2019 года официальный представитель nVidia заявил на форуме nVidia, что nVidia не планирует реализовывать масштабирование без размытия в видеодрайвере для Windows. В качестве причины называется невозможность такой реализации этой функции в Windows-драйвере, которая не потребовала бы постоянного сопровождения («ongoing continuous support»). Подробности не уточняются.

AMD — недоступно, но включено в опрос

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

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) полноэкранном режиме видна ещё меньшая часть изображения, т. к. не только часть исходного изображения масштабируется до физического разрешения монитора, но и монитор переключается в меньшее разрешение.