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

Кратко

Проблема

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

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

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

Решение

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

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

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

Что делать

  • Подпишите петицию о масштабировании без размытия в видеодрайвере.
  • Проголосуйте за добавление функции в видеодрайвер 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, старые программы при целочисленных системных масштабах автоматически масштабируются без размытия.
  • В Windows 10 для игр с поддержкой псевдо­полно­экранного режима «Borderless» возможно масштаби­рование без размытия с масштабом, равным системному масштабу.

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

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

    • игра должна быть запущена в режиме DPI-виртуализации (DPI scaling) — встроенном в Windows режиме масштабирования устаревших программ, не рассчитанных на экраны с высокой плотностью точек;
    • в настройках игры должен быть выбран режим «Borderless». В разных играх этот режим может называться по-разному, например, «Borderless Full Screen», «Borderless Windowed» или просто «Borderless». В некоторых играх режим, называемый полноэкранным («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» → секция «Переопределение масштабирования с высоким разрешением» → галка «Переопределите режим масштабирования высокого разрешения. Масштабирование выполняется» → пункт «Система» выпадающего списка.

Телевизоры

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

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