Blog (57)
Komentarze (10k)
Recenzje (1)
@BerionGehenna skalowania obrazu

Gehenna skalowania obrazu

Przed wiekami, kiedy nasi przodkowie ozdabiali jaskinie wizerunkami zwierząt, a w każdym razie niedługo po - pod strzechą w każdym domu można było znaleźć stojący na piedestale, kolorowy telewizor CRT. Wielki kineskopowy baniak, grzejąco-elektryzujący, wyświetlający obraz zgoła odmiennie od dzisiaj dominujących LCD, OLED, a jeszcze nie tak dawno także PDP. Pod wieloma z tych piekielnych machin, nieśmiało wystawała konsola. W Polsce był to oczywiście legendarny Pegasus i jego niezliczone klony, w USA czy Japonii niepomiernie szersze spektrum „gier wideo”: od Sega Master System, przez SNES, aż po takie egzotyki jak NEC TurboGrafx-16. Mijają lata, kolejne generacje konsol, a nośniki optyczne kręcą się pod wciąż obecnymi w życiu każdego gracza telewizorami CRT.

Dzisiejsze matryce pozwalają na wyświetlanie rozdzielczości 1920x1080 (a nawet i wyższych) w proporcjach 16:9. Jest to ogólnie przyjęty i obecnie najpopularniejszy wspólny standard obejmujący konsole, filmy i PC. Dawniej najczęściej spotykanymi formatami obrazu były oczywiście 4:3 w 320x240 i 640x480. Przez to, że mieliśmy także podział na regiony, gry wyświetlają się bardzo różnie na różnych konsolach i komputerach (np. gry na PS2 w PAL to 640x512, a w NTSC 640x448, zaś gry na FC/NES to 256x224 w PAL‑A i B, a NTSC już tylko 256x208). Mało tego, ze względu na ograniczenia sprzętowe jak i samych silników gier, nie zawsze są zachowane i te rozdzielczości (bywają mniejsze w pionie).

I jak teraz taki chaos wyświetlić na nowoczesnym telewizorze lub monitorze? Co się stanie z obrazem? Tutaj do akcji wkracza skalowanie obrazu przez konsolę (emulatory na PS3, X360 etc.) lub telewizor (w każdym przypadku kiedy rozdzielczość jest niższa niż natywna matrycy). Niniejszy materiał będzie traktować właśnie o tym jak gry wyglądały kiedyś i jak dzisiejsze technologie to rujnują (co zresztą jest podle wykorzystywane przez kłamliwy marketing wydawców remasterów). Kwestię okablowania, konwerterów i przelotek pominę bo to tutaj najmniej istotne, a także było już wielokrotnie wałkowane na dowolnym growym portalu (a więc kwestię jakości sygnału i możliwych artefaktów).

Uwaga!

Ze względu na „silnik blogowy”, który skaluje (psuje ;)) przesyłane pliki graficzne, polecam pobrać paczkę ze wszystkimi zamieszczonymi w dalszej części tekstu zrzutami ekranu. Większość jest w rozdzielczości 1280x720, którą należy oglądać na ekranie z natywną 1920x1080 lub wyższą. Dlaczego nie 720p? Dlatego, że musiałbyś wyświetlać je na pełnym ekranie aby miało to sens. Dlatego najbezpieczniej i najwygodniej jest oglądać na wyższej rozdzielczości kiedy cała grafika - niepowiększona ani niepomniejszona - mieści się w oknie. W przeciwnym razie może być ci ciężko wyobrazić sobie to o czym piszę w danej chwili.

Brak skalowania

Obraz z antyku można na niektórych telewizorach (coraz rzadziej spotykana opcja) wyświetlić bez skalowania w taki sposób, że wyświetlany obraz jest 1:1, a pozostałe miejsce zapełnione czarnym ekranem. Dzięki temu, obraz jest ostry jak żyleta, wręcz doskonałej jakości i… mikroskopijny, uniemożliwiający komfortową grę. ;) Im wyższa natywna rozdzielczość matrycy, tym mniejsze okno z grą (wyobraź sobie dowolny tytuł z Pegasusa na ekranie 8K).

Oryginalna rozdzielczość „The Fantastic Adventures of Dizzy” na konsolę Famicom.
Oryginalna rozdzielczość „The Fantastic Adventures of Dizzy” na konsolę Famicom.
Wizualizacja odwzorowania w skali 1:1 na ekranie 720p.
Wizualizacja odwzorowania w skali 1:1 na ekranie 720p.

Skalowanie stratne

Nie sądzę aby ktokolwiek potrafił mordować się z mikrobem z powyższego akapitu, dlatego najczęstszą formą skalowania jest - umownie je nazwijmy - stratne. Dzieje się tak dlatego, że nie sposób podzielić bez reszty obu liczb naraz: 1280 i 720 (a także ich wielokrotności) przez szerokość i wysokość „starszych rozdzielczości”, otrzymując tę samą liczbę całkowitą. Wyspecjalizowane algorytmy zajmują się transformacją obrazu w locie, czego konsekwencją jest gigantyczna strata na jakości.

Oryginalna rozdzielczość „Tenchu: Stealth Assassins” na konsolę PlayStation.
Oryginalna rozdzielczość „Tenchu: Stealth Assassins” na konsolę PlayStation.
Wizualizacja odwzorowania po przeskalowaniu algorytmem bilinear (dwuliniowym) na ekranie 720p.
Wizualizacja odwzorowania po przeskalowaniu algorytmem bilinear (dwuliniowym) na ekranie 720p.

Im mniejsza rozdzielczość źródłowa, tym gorsza jakość po przeskalowaniu. A jeśli gra oryginalnie powstała z myślą o proporcjach 4:3 to tragedia jest jeszcze większa. Okręgi stają się owalami, szczegóły ulegają zatarciu, traci się ostrość na całej powierzchni (szczególnie jest to dotkliwe na starych czcionkach).

Czasami emulatory w konsolach lub wbudowane mechanizmy w telewizor, pozwalają przeskalować obraz, zachowując oryginalne proporcje, a jeśli do tego specyfika silnika gry i jej styl nie pozwalają utrzymać idealnej ostrości na oryginalnej platformie, całość nie wypada już tak źle. Świetnym przykładem może być Okami.

Zrzut ekranu, przechwycony przez kartę wideo (czyli już ze znacznym spadkiem jakości) w oryginalnej rozdzielczości gry „Okami” na PlayStation 2.
Zrzut ekranu, przechwycony przez kartę wideo (czyli już ze znacznym spadkiem jakości) w oryginalnej rozdzielczości gry „Okami” na PlayStation 2.
Wizualizacja odwzorowania po przeskalowaniu algorytmem bilinear (dwuliniowym) na ekranie 720p z zachowaniem proporcji.
Wizualizacja odwzorowania po przeskalowaniu algorytmem bilinear (dwuliniowym) na ekranie 720p z zachowaniem proporcji.
Jak wyżej, jednak tym razem bez zachowania proporcji, ale też bez rozciągania na cały ekran.
Jak wyżej, jednak tym razem bez zachowania proporcji, ale też bez rozciągania na cały ekran.

Skalowanie bezstratne

Jedynym algorytmem umożliwiającym bezstratne przeskalowanie obrazu, czyli z zachowaniem tej samej jakości co w rozdzielczości źródłowej, jest najbliższy sąsiad. Działa on tak, że powiela każdy piksel i dostawia do niego trzy kolejne, dokładnie takie same, sąsiadujące z jego rogiem i dwoma bokami (im większy obraz, tym iteracji jest więcej, oczywiście to przykład zachowujący te same proporcje). Algorytm ten jest nie tylko najprostszy w implementacji, ale także najmniej zasobożerny.

Porównanie skalowania z użyciem algorytmu nearest neigbour (najbliższy sąsiad) i bicubic (dwusześciennego).
Porównanie skalowania z użyciem algorytmu nearest neigbour (najbliższy sąsiad) i bicubic (dwusześciennego).

Jak wyżej widać, nawet na tak banalnym czterokolorowym przykładzie można dostrzec utratę szczegółów w przypadku zastosowania czegokolwiek innego niż NN (a nawet fałszowania kolorów!). Gdzie jest zatem haczyk? Dlaczego prawie nikt tego nie stosuje w telewizorach, odtwarzaczach, konsolach i oficjalnych emulatorach? Być może dlatego, że pamięć mas jest bardzo krótka, więc trzeba być autystykiem lub wyjątkowym pasjonatem, aby pamiętać jak wyglądała gra czy film 20 lat temu (a więc jakość przestaje być istotna), z kolei czarne ramki po bokach lub nawet dookoła, irytują większość graczy/widzów.

Poniżej znajdują się wizualizacje skalowania NN w czterech wariantach:

  1. idealnym, gdzie (w tym przypadku) gra „Gimmick!” z FC/NES została podbita trzykrotnie, a pozostałe miejsce wypełnione czarnym tłem
  2. rozciągnięciem, tak aby zająć cały pion, ale jednocześnie z zachowaniem proporcji
  3. rozciągnięciem maksymalnie w pionie i trochę na szerokość
  4. rozciągnięciem na cały ekran
146293
146294
146295
146296

Gęstość

Największą różnicę - wręcz kolosalną - widać na materiale z ~256 kolorami i mniej, na dodatek na możliwie jak największym ekranie o niskim PPI. Ale również nawet na nowszych grach czy filmach VCD i DVD‑Video (oczywiście masterowanych nie z VHS/Betacam tylko taśmy filmowej). Jeśli PPI jest wysokie, czyli stosunek wielkości ekranu do jego rozdzielczości (w skrócie: im więcej pikseli pomieści na cal), a różnica rozdzielczości źródłowej z natywną matrycy np. telewizora jest nieduża, to tylko dla tandemu wprawnego oka i słoniowej pamięci, rozmazanie ekranu będzie nieznośne.

Wykorzystuje to np. Sony w konsoli PlayStation Vita, która posiada wbudowany emulator PlayStation Portable. Natywną rozdzielczością PSV jest 960x544 czyli dokładnie dwukrotnie więcej niż miało PSP. Pomimo „blurowanego” obrazu gier z tamtych lat, który na dodatek nie jest w stanie zamaskować braku aliasingu na wektorach i obiektach 3D, przy PPI wynoszącym 220, jest zaskakująco strawny.

Oryginalna rozdzielczość „Loco Roco 2” na konsolę PlayStation Portable.
Oryginalna rozdzielczość „Loco Roco 2” na konsolę PlayStation Portable.
Wizualizacja zrzutu ekranu tej samej gry, emulowanej na PlayStation Vita.
Wizualizacja zrzutu ekranu tej samej gry, emulowanej na PlayStation Vita.

Skalowanie na poziomie silnika gry

W przypadku emulatorów i wirtualizatorów, można podejść do kwestii skalowania jeszcze inaczej bo już na poziomie emulacji gry, między innymi sztucznie podbijając rozdzielczość. Wówczas to platforma emulująca zajmuje się - nieprzetwarzaniem tylko generowaniem obrazu - a nie telewizor/monitor.

Poniżej w przykładzie „Vagrant Story” z konsoli PlayStation, emulowany na PlayStation 2 za pomocą PS2PSXe, wyświetlany w 640x512. Niestety z tzw. szwami na obiektach (boki tekstur nie pasują do siebie), które są skutkiem ubocznym podniesienia rozdzielczości.

632062

Wnioski

Dla większości osób utrata jakości nie ma żadnego znaczenia ponieważ zwyczajnie jest dla nich na tyle mała, że nieistotna lub nawet niedostrzegalna, ewentualnie nie mają punktu odniesienia i niewiedzą jak materiał wyglądał w oryginale. Sprawę pogarsza także bezlitosna fizyka, bowiem im mniejsza różnica w rozdzielczościach, im większa odległość obserwatora od ekranu i im mniejszy ekran, tym mniejsza dostrzegalna różnica. Dochodzi także aspekt jakości kabla, przetwarzania sygnału, a nawet ustawienia matrycy (np. kontrastu, jasności, odwzorowania kolorów). Z przykrością więc stwierdzam, że cała moja powyższa boleść nikogo nie obchodzi i cały ten wywód był daremny. :)

Wybrane dla Ciebie
Komentarze (40)