Grafika komputerów PC

Liczba odsłon: 330

Projektanci komputera IBM PC pewnie nie spodziewali się ani przez chwilę jak popularna stanie się ich konstrukcja i jak długo w użyciu pozostaną prymitywne w zasadzie rozwiązania techniczne w niej zastosowane. Niezwykła elastyczność otwartej architektury PC, która dopiero niedawno zaczęła ulegać ograniczeniu przez tendencje do integrowania wszystkich elementów komputera na płycie głównej, zapewniła możliwość użycia komputera PC w każdym zastosowaniu — od przetwarzania tekstów, przez grafikę komputerową, aż po obliczenia inżynierskie.

Jednym z najodważniejszych kroków projektantów „peceta” była rezygnacja z terminalowego podejścia do obsługi ekranu, stosowanego dotychczas w „poważnych” komputerach biurowych. Pamięć obrazu, zamontowaną na wymiennej karcie rozszerzającej, uczyniono bezpośrednio dostępną dla mikroprocesora przez umieszczenie jej w jego przestrzeni adresowej. W ten sposób nie tylko umożliwiono użytkownikowi wybór rozwiązania o satysfakcjonujących go możliwościach graficznych (lub ograniczenie ceny komputera w przypadku mniejszych wymagań), lecz również zwiększono wielokrotnie możliwości oprogramowania, które zamiast nieintuicyjnego przetwarzania tekstu wiersz po wierszu dostało do dyspozycji całą powierzchnię ekranu wraz z możliwością błyskawicznego odczytywania i modyfikowania jego zawartości.

Era terminali

Zanim jeszcze IBM PC pojawił się w sklepach, we wnętrzach minikomputerów zatrudnionych do poważnych zadań królowało terminalowe podejście do obsługi ekranu. Sam komputer najczęściej pozbawiony był możliwości generowania tekstu i obrazu, dysponował za to sporą liczbą łącz szeregowych umożliwiających podłączenie osobnych urządzeń tekstowo-graficznych, tak zwanych terminali. Terminale odczytywały polecenia przesyłane z komputera, modyfikowały na ich podstawie wyświetlany obraz i przekazywały z powrotem kody naciskanych klawiszy.

Największą zaletą techniki terminalowej była prostota realizacji wielodostępu. Dokupienie kilku tanich terminali umożliwiało zwiększenie obciążenia centralnego minikomputera i bardziej efektywne wykorzystanie jego możliwości. Praca terminalowa mogła też być przerwana w dowolnym momencie i wznowiona później, gdyż terminal był tylko prostym sposobem uzyskania chwilowego dostępu do komputera.

Wraz z rozwojem tej techniki możliwości terminali zwiększały się. Najpierw pojawiły się atrybuty tekstu i możliwość dowolnego pozycjonowania kursora, co stworzyło możliwości tworzenia oprogramowania działającego w trybie pełnoekranowym. Najbardziej zaawansowane terminale obsługiwały również tryb graficzny, interpretując polecenia protokołu X Window. Jednak mimo oczywistych zalet (spośród których największą jest możliwość uzyskania dostępu do komputera z terminala położonego w dowolnym miejscu świata, za pośrednictwem globalnych łącz teleinformatycznych), terminalowa obsługa ekranu jest powolna i niepotrzebnie skomplikowana, co miało szczególne znaczenie gdy komputery i terminale nie były jeszcze tak szybkie, jak dzisiaj.

Era bufora ramki

W tym samym czasie w ośmiobitowych domowych mikrokomputerach zamiast drogiej i skomplikowanej terminalowej obsługi ekranu stosowano tak zwany bufor ramki. Zasada działania bufora ramki jest prymitywnie prosta: na potrzeby opisu obrazu przeznacza się fragment pamięci operacyjnej regularnie odczytywany przez układ elektroniczny zamieniający cyfrowe informacje o obrazie na sygnał analogowy sterujący monitorem lub telewizorem (współcześnie taki układ nosi nazwę RAMDAC, ang. Random Access Memory Digital/Analog Converter). Zaletą takiego rozwiązania jest prostota: by zmodyfikować obraz program musi po prostu zapisać właściwe liczby w odpowiednim miejscu pamięci. Istotną zaletą jest zmniejszenie kosztów, gdyż układ RAMDAC jest nieporównywalnie prostszy od terminala interpretującego skomplikowane nieraz polecenia. Dodatkowym plusem jest możliwość odczytywania zawartości ekranu, niedostępna w tradycyjnych terminalach.

W wielu komputerach, by przyspieszyć ich działanie i w efekcie zwiększyć komfort użytkowania, zmodyfikowano ideę bufora ramki wprowadzając dodatkowy tekstowy tryb pracy. W trybie tekstowym w wydzielonym na opis obrazu obszarze pamięci zapisuje się nie dokładny, cyfrowy opis każdego punktu (piksela), lecz tylko kody i atrybuty poszczególnych liter. Układ RAMDAC musiał ulec oczywiście skomplikowaniu – pojawił się nowy moduł dokonujący zamiany kodów znaków na sekwencje punktów o odpowiedniej barwie – jednak szybkość modyfikowania i przewijania ekranów pełnych tekstu ulegała zdecydowanej poprawie.

Właśnie taką mieszaną technikę tekstowo-graficznego bufora ramki postanowili wykorzystać inżynierowie z firmy IBM. Ich pracę dodatkowo ułatwiał fakt, że cała elektronika karty graficznej (wraz z pamięcią przechowującą opis obrazu) miała znajdować się na osobnej, wymiennej karcie, dzięki czemu pierwsze, prymitywne karty mogły zostać wymienione w przyszłości na bardziej zaawansowane technicznie i oferujące lepszą jakość obrazu i wyższą wydajność. Nie bez znaczenia była też olbrzymia jak na ówczesne czasy przestrzeń adresowa procesorów Intel 8086/8088, dzięki czemu bufor ramki (na który zarezerwowano w sumie 128 KiB przestrzeni adresowej!) nie ograniczał pojemności pamięci dostępnej dla programów użytkownika (co było poważnym problemem w przypadku komputerów ośmiobitowych).

Monochrome Display Adapter

Pierwszą kartą graficzną dla komputerów PC była MDA — Monochrome Display Adapter. W zamyśle miała być idealnym rozwiązaniem dla osób zajmujących się obróbką tekstu, bazami danych i obliczeniami, gdyż zapewniała bardzo wyraźny, monochromatyczny tekst. Brak możliwości graficznych przekreślił jednak jej szanse na akceptację wśród użytkowników i uczynił z niej raczej kartę testową, zaprojektowaną tylko po to, by widać było, że komputer faktycznie działa i produkowaną tylko do momentu opracowania lepszych, bardziej uniwersalnych rozwiązań.

Jedynym trybem, w jakim działała karta MDA, był tryb tekstowy o kodzie 7 zapewniający 25 wierszy po 80 znaków tekstu. Każdy znak opisany był w rastrze 9×14 pikseli i mógł być ukryty (ang. hidden), rozjaśniony (ang. bright), podkreślony (ang. underlined) lub wyświetlany w inwersie (ang. reverse video). Dodatkową funkcją było sprzętowe migotanie (ang. blinking) wskazanych znaków. Informacje o obrazie w takim trybie zajmowały dokładnie 4000 bajtów (80×25 bajtów na znaki i drugie tyle na ich atrybuty), karta została zatem wyposażona w 4 KiB pamięci bufora ramki.

Karta MDA nie zdążyła na szczęście rozpowszechnić się zbytnio. W momencie, w którym komputery klasy IBM PC zaczęły być popularne na całym świecie, została zastąpiona kolejnymi, doskonalszymi rozwiązaniami.

Karta MDA
Oryginalna karta graficzna MDA w formie pełnej długości karty ośmiobitowej. Widoczne standardowo montowane gniazdo portu równoległego LPT.

Color Graphics Adapter

Zgodnie z założeniami karta CGA – Color Graphics Adapter – miała być przeznaczona dla osób zajmujących się grafiką prezentacyjną (wykresy, schematy, diagramy) oraz projektowaniem wspomaganym komputerowo (CAD, CAE). Nie zdobyła ona jednak uznania wśród użytkowników korporacyjnych, stając się za to na jakiś czas standardem w komputerach kupowanych do domów, zapewniała bowiem możliwość stosowania kolorowego tekstu i grafiki (ta ostatnia była szczególnie przydatna w pierwszych grach pisanych na PC).

W trybie tekstowym karta CGA oferowała obraz wyświetlany w 25 wierszach po 40 lub 80 znaków w każdym. Oprócz wszystkich atrybutów „odziedziczonych” po MDA (poza podkreśleniem znaków) obsługiwała 8 kolorów tła znaków i 16 kolorów samych znaków, po raz pierwszy wzbogacając możliwości biurowego komputera osobistego o prezentację barw. W trybach graficznych można było wyświetlać obraz o rozdzielczości 320×200 pikseli w czterech kolorach lub 640×200 pikseli w dwóch kolorach.

Największą wadą CGA, przekreślającą jej szanse na akceptację w biurach i wśród zaawansowanych użytkowników, była tragicznie niska jakość wyświetlanych znaków. Matryca opisująca znaki miała rozmiar tylko 8×8 pikseli, przez co wyświetlany tekst był kanciasty, nieczytelny i rozmyty. O ile na monitorze monochromatycznym nie wyglądało to jeszcze aż tak źle (choć traciło się w ten sposób możliwość prezentacji barw), monitor kolorowy dodatkowo pogarszał jakość obrazu „rozmywając” piksele. W grach to nie przeszkadzało, jednak dłuższa praca w edytorze tekstu czy arkuszu kalkulacyjnym musiała kończyć się bolesnym zmęczeniem oczu.

Ekran
Przykład monochromatycznej grafiki CGA w trybie 640×200

Ciekawą cechą karty CGA było narzucanie palety barw w trybie graficznym 320×200 pikseli. Do dyspozycji były dwa (a przy odrobinie kombinowania trzy) zestawy, z których każdy zawierał barwy zapewniające generowanej grafice zdecydowanie „oryginalny” wygląd:

Paleta 0:   tło turkus fiolet jasny szary
Paleta 1:   tło zielony czerwony brązowy
Paleta 2:   tło turkus czerwony jasny szary

We wszystkich trybach graficznych można też było zmienić kolor tła z czarnego na dowolny z 16 dostępnych, a w trybie „wysokiej rozdzielczości” 640×200 pikseli również kolor pierwszego planu z białego na dowolny. Trudno jednak nie zgodzić się, że możliwości graficzne karty CGA były wysoce niezadowalające zarówno pod względem rozdzielczości, jak i liczby i palety barw.

Na osłodę karta CGA kryła parę niespodzianek. Pierwszą z nich było 16 KiB pamięci obrazu, co umożliwiało przechowywanie 8 pełnych stron tekstu w trybie 40×25 znaków i 4 stron w trybie 80×25 znaków; przełączanie między stronami następowało w sposób natychmiastowy, a programy mogły przygotowywać strony do wyświetlania w czasie, gdy były one jeszcze ukryte, zapisując dane w odpowiednie obszary pamięci operacyjnej.

Drugą był tryb semigraficzny 160×100 pikseli, uzyskiwany przez przeprogramowanie kontrolera obrazu w tryb tekstowy 80×100 znaków i wypełnienie całego obrazu tym samym symbolem dzielącym pole znakowe na połowy — jedna o barwie tła, a druga o barwie pierwszego planu. Kolejna rekonfiguracja kontrolera obrazu wyłączała atrybut migotania znaków, umożliwiając dostęp do wszystkich 16 barw jako kolorów tła. Od tego momentu samymi tylko operacjami na atrybutach obrazu można było zmieniać barwy poszczególnych niby-pikseli, uzyskując obraz o bardzo małej rozdzielczości, wystarczający jednak do realizacji wielobarwnych plansz tytułowych lub wykresów i diagramów.

Ekran
Przykład kolorowej grafiki CGA w trybie 320×200

Karcie CGA, początkowo dosyć drogiej, a niewątpliwie pozbawionej większych możliwości, udało się jednak ustanowić pewnego rodzaju standard. Pojawiło się nawet kilka zgodnych z CGA kart niezależnych producentów, implementujących również tryby graficzne o wyższej liczbie barw. Szerokie rozpowszechnienie obsługi CGA w oprogramowaniu sprawiło, że każda późniejsza karta graficzna produkcji IBM potrafiła emulować jej działanie (dotyczy to również najnowszych kart Super VGA niezależnych producentów). Jednak kartą, która trwale odebrała prymat CGA i ustanowiła standard obowiązujący całe lata był produkt nie IBM, a niewielkiej firmy Hercules Computer Technology.

Hercules Graphics Card

Brak możliwości graficznych karty MDA i żałosna jakość tekstu i grafiki w przypadku karty CGA umożliwiły w 1982 roku firmie Hercules Computer Technology rozpowszechnienie własnego rozwiązania. Karta HGC – Hercules Graphics Card – łączyła zalety MDA i CGA (oprócz możliwości stosowania barw) likwidując ich wady.

Karty HGC
Dwa różne egzemplarze ośmiobitowej wersji karty graficznej Hercules Graphics Card. Widoczne są gniazda portu równoległego LPT, montowane standardowo na wszystkich kartach graficznych HGC (podobnie jak w przypadku MDA).

Karta HGC (zwana najczęściej po prostu Herculesem) oferowała tylko jeden monochromatyczny tryb tekstowy 80×25 znaków (całkowicie zgodny z MDA) i jeden monochromatyczny tryb graficzny 720×348 pikseli (niezgodny z niczym). Ponieważ na płytce karty zainstalowana była pamięć o pojemności 64 KiB, możliwe było rysowanie obrazu tekstowego na 16, a graficznego na dwóch niezależnych, przełączanych sprzętowo stronach. Matryca znaków miała rozmiar 9×14 pikseli, zapewniając czytelność obrazu identyczną z MDA.

Problem niezgodności z CGA rozwiązano początkowo za pomocą programów emulujących CGA (najpopularniejszym był color.com). Z braku kolorów wszystkie barwy były symulowane za pomocą technik rozpraszania (ang. dithering). Szybko rosnąca popularność Herculesa spowodowała jednak, że programiści chętnie dodawali do swoich programów obsługę tej karty, z czego największe zyski czerpali projektanci, zyskując czarno-biały co prawda, lecz pojemny i wyraźny pulpit graficzny znacznie przewyższający jakością wyświetlanego obrazu osiągnięcia karty CGA.

W trybie tekstowym karta HGC używała zestawu znaków zapisanego w pamięci ROM (tak samo zresztą jak MDA i CGA), co zmuszało użytkowników posługujących się językiem innym niż angielski do przeprogramowywania generatora znaków. I na to znalazło się rozwiązanie: pakiet programowy GOP16H autorstwa Andrzeja Kadlofa symulował tryb tekstowy w trybie graficznym karty HGC, za cenę mniejszej wydajności dając możliwość w pełni programowej zamiany całego zestawu znaków (a nawet jednoczesnego używania dwóch niezależnych zestawów znaków).

Choć z czasem coraz silniej zintegrowane rozwiązania różnych producentów zgodne z HGC rozpowszechniały się i stawały się coraz tańsze (w skrajnej formie obsługą obrazu zajmował się jeden układ scalony, zawierający w swoim wnętrzu nawet pamięć obrazu), ogólny spadek cen elektroniki spowodował, że użytkownicy chętniej sięgali po nowsze karty, wyposażone w możliwość prezentacji barwnej. Producent Herculesa próbował jeszcze „reanimować” swój produkt rozszerzając go o możliwość definiowania zestawu znaków używanego w trybie tekstowym (HGC+, 1986 rok) i o kolorową grafikę (HICC, 1987 rok), nie mógł już jednak powstrzymać ofensywy doskonalszych produktów firmy IBM. Wraz z rozpowszechnieniem standardu VGA pamięć o Herculesie umarła.

Enhanced Graphics Adapter

Równolegle z premierą nowego, wydajnego modelu PC/AT, firma IBM postanowiła zaprezentować nowy moduł graficzny wykorzystujący moc obliczeniową komputerów AT i rozszerzający ich możliwości prezentacji danych. Karta EGA – Enhanced Graphics Adapter – miała zastąpić zarówno MDA, jak i CGA.

Karta EGA
Karta QuadEGA firmy Quadram.

Najważniejszą cechą nowej karty była dalece posunięta – choć nie pełna – zgodność z zastępowanymi standardami. Karta EGA obsługiwała zarówno tryb tekstowy MDA, jak i tryby tekstowe i graficzne CGA. W trybie tekstowym – nawet podczas emulacji karty CGA – zapewniała zawsze jakość obrazu dorównującą MDA (matryca znaków miała rozmiar 8×14 pikseli). Dodatkowy tryb tekstowy, przeznaczony dla osób pragnących zmieścić na jednym ekranie jak największą ilość informacji, kosztem zmniejszenia matrycy znaków do 8×8 pikseli (standardowa czcionka CGA) umożliwiał wyświetlanie 43 wierszy po 80 znaków w każdym.

Pierwsze modele karty wyposażone były w 64 KiB pamięci obrazu, co pozwalało na korzystanie – oprócz emulowanych trybów graficznych CGA – z 16-kolorowego trybu niskiej rozdzielczości (320×200 pikseli), 16-kolorowego trybu średniej rozdzielczości (640×200 pikseli) oraz monochromatycznego i czterokolorowego trybu wysokiej rozdzielczości (640×350 pikseli). Rozszerzenie pamięci do 128 KiB uaktywniało 16-kolorowy tryb wysokiej rozdzielczości, dzięki czemu przy pojemności obrazu niewiele ustępującej karcie Hercules na ekranie można było obserwować grafikę wykorzystującą jednocześnie szesnaście z 64 dostępnych barw. Pełna obsada pamięci (256 KiB) umożliwiała tylko wykorzystanie dwóch równoległych, przełączanych sprzętowo ekranów graficznych wysokiej rozdzielczości (co było przydatne podczas animacji).

Karta EGA była wyposażona w nieco tajemnicze gniazdo krawędziowe nazwane Feature Connector. Choć rzadko wykorzystywane, pozwalało ono na mieszanie obrazu z zewnętrznego źródła z obrazem wyświetlanym na ekranie komputera (aż po całkowite zastąpienie sygnału innym, na przykład pochodzącym z modułu rozbudowującego możliwości graficzne) i modyfikowanie parametrów obrazu (na przykład tworzenie nowych trybów tekstowych o wyższej rozdzielczości).

EGA była też pierwszą popularną kartą graficzną wyposażoną we własny program BIOS, uzupełniający i zastępujący procedury zapisane w BIOSie płyty głównej. Dzięki temu możliwa była pełna obsługa aplikacji przystosowanych do grafiki CGA i udostępnianie w zestandaryzowany sposób nowych funkcji i trybów graficznych.

Grafika EGA
16-kolorowa grafika karty EGA w rozdzielczości 320×200 pikseli

Karty zgodne z EGA produkowane przez niezależnych producentów – z modelu na model silniej zintegrowane i tańsze w produkcji – oferowały często dodatkowe możliwości, na przykład emulację karty HGC (z oczywistych względów funkcji tej nie miała oryginalna karta produkcji IBM) lub wyższe rozdzielczości graficzne i tekstowe. Nadejście ery VGA trzy lata później przypieczętowało jednak los EGA zanim jeszcze nastąpiła masowa rezygnacja ze standardu Herculesa.

Multicolor Graphics Adapter

Karta MCGA nigdy nie była dostępna w formie osobnej karty rozszerzającej. MCGA – Multicolor Graphics Adapter – była montowana w formie zintegrowanej z płytą główną (choć z własną, niezależną pamięcią graficzną o pojemności 64 KiB) w komputerach IBM PS/2, Model 25 i 30. W zamierzeniach miała zastąpić kartę CGA, dając jednocześnie możliwości graficzne potrzebne domowemu użytkownikowi zainteresowanemu grami komputerowymi i prostymi programami użytkowymi, a więc wielokolorową grafikę niskiej rozdzielczości i monochromatyczną grafikę wysokorozdzielczą.

Karta MCGA była zgodna z MDA i CGA na poziomie programowym. W trybach tekstowych zapewniała znacznie wyższą jakość obrazu (siatka znaku 9×16 pikseli), nie tylko nadrabiając wady CGA, ale też osiągając lepszą jakość niż MDA i EGA. Niestety, MCGA nie potrafiła emulować trybów graficznych EGA; usprawiedliwiała to w pewnym zakresie obecność dwóch nowych trybów pracy, z których pierwszy – 320×200 pikseli w 256 kolorach wybranych z palety 262 144 barw – był wprost stworzony dla gier komputerowych i grafiki reklamowej, a drugi – monochromatyczny 640×480 pikseli – konkurował z kartą HGC dając obraz o znacznie przyjemniejszych proporcjach.

Grafika MCGA
256-kolorowa grafika karty MCGA w rozdzielczości 320×200 pikseli

Video Graphics Array

Podczas gdy MCGA była tylko przygrywką – prostym, silnie zintegrowanym układem do tanich komputerów – silniejsze modele z rodziny PS/2 zostały wyposażone w układ graficzny nowej generacji, który – jak się okazało – wyznaczył standard obowiązujący do dziś.

Kontroler VGA – Video Graphics Array – podobnie jak MCGA wykorzystywał najnowsze zdobycze w zakresie układów scalonych projektowanych do konkretnych zastosowań (ASIC, ang. Application-Specific Integrated Circuit). Dzięki temu funkcjonalność olbrzymich kart rozszerzających zbudowanych w oparciu o uniwersalne kontrolery wizji udało się zmieścić w jednym układzie scalonym, wymagającym tylko kilku zewnętrznych elementów i łatwym w zintegrowaniu z płytami głównymi komputerów PS/2. Podobnie jak EGA i MCGA układ VGA wymagał własnej pamięci BIOS, zawierającej procedury obsługi wszystkich trybów graficznych.

Grafika VGA
Windows 3.0 with Multimedia Extensions wyświetlające pulpit za pomocą karty graficznej VGA w 16-kolorowym trybie 640×480 pikseli

Podstawowym zadaniem konstruktorów VGA było zapewnienie zgnodności z wszystkimi poprzednimi kartami graficznymi sprzedawanymi przez koncern. W efekcie VGA obsługiwał tryby tekstowe MDA (z lepszej jakości tekstem — siatka znaku miała rozmiar 9×16 pikseli), tekstowe i graficzne CGA (znów z tekstem o nieporównywalnie lepszej jakości), tekstowe i graficzne EGA (tekst jak wyżej) oraz własne dodatkowe tryby:

Ponadto, kontroler VGA umożliwiał – nareszcie! – dowolne manipulowanie zestawami znaków używanymi w tekstowych trybach pracy. Dzięki temu można było dokonać wymiany zestawu znaków – czy to z powodów estetycznych, czy w celu zaprogramowania dodatkowych znaków alfabetów nieangielskich – w sposób czysto programowy, bez konieczności przeprogramowywania pamięci EPROM generatora znaków czy uciekania się do sztuczek w stylu emulacji trybu tekstowego w trybie graficznym.

Stopień integracji kontrolera VGA utrudniał jego klonowanie (producenci konkurencyjnych wersji musieli w zasadzie zaprojektować własne układy o analogicznej funkcjonalności), nie przeszkodziło to jednak w szybkim rozpowszechnieniu się VGA jako standardu. Zaczęły pojawiać się nawet karty o lepszych parametrach, udostępniające szerszą paletę barw oraz wyższe rozdzielczości i nazywane wspólnym mianem Super VGA. Początkowo każda taka karta wymagała specyficznych modułów sterujących, dostosowujących każdy program do swoich możliwości, szybko jednak okazało się, że znacznie lepszym rozwiązaniem jest zestandaryzowanie dodatkowych trybów graficznych. Uczyniono to w ramach organizacji VESA (ang. Video Electronics Standards Association), a do obsługi ujednoliconych trybów graficznych wyznaczono moduł programowy VESA BIOS (rozszerzający BIOS kontrolera VGA), który mógł być instalowany w formie rezydentnego sterownika (dostosowując do standardu VESA nawet niektóre starsze karty graficzne) lub zintegrowany z BIOSem VGA.

Era akceleratorów i koprocesorów graficznych

Wraz ze wzrostem stopnia skomplikowania graficznych interfejsów użytkownika (GUI, ang. Graphical User Interface) oraz liczby punktów i kolorów wyświetlanych jednocześnie na ekranie stało się jasne, że klasyczna idea bufora ramki nie zdaje egzaminu. Mimo stosowania coraz szybszych magistral i coraz szybszych pamięci graficznych odrysowywanie obrazu było zauważalnie powolne.

Naturalnym, narzucającym się rozwiązaniem było przeniesienie części odpowiedzialności za tworzenie obrazu z procesora centralnego (dotychczas samodzielnie zapisującego dane obrazu do pamięci graficznej) na układy zamontowane na płytce karty graficznej. Takie specjalizowane układy podlegające możliwości programowania dowolnych operacji graficznych nazwano koprocesorami graficznymi (ang. graphics co-processor), podczas gdy ich prostsze wersje z narzuconym zestawem operacji graficznych — akceleratorami grafiki (ang. graphics accelerators).

Możliwość programowania dowolnych funkcji graficznych była szczególnie nęcąca dla programistów pracujących nad pakietami graficznymi. Zamiast polegać na powolnym procesorze centralnym, mogli oni zaprogramować potrzebne funkcje (rysowanie krzywych, wypełnianie powierzchni, przemieszczanie bloków obrazu, zmianę jasności i kontrastu) bezpośrednio w układach karty graficznej i zlecać potem ich wykonywanie. Pozwalało to nie tylko przyspieszyć generowanie obrazu (koprocesor graficzny miał bezpośredni dostęp do pamięci obrazu, podczas gdy procesor centralny cały czas musiał korzystać z pośrednictwa magistrali rozszerzającej), ale też zwalniało CPU do wykonywania innych zadań w tym samym czasie. Podczas gdy koprocesor graficzny mozolił się z rysowaniem jednej skomplikowanej krzywej, procesor centralny mógł już przygotowywać parametry kolejnej. Takie zrównoleglanie przetwarzania pozwalało znów odczuć użytkownikom wydajność szybkich mikroprocesorów ich komputerów, mimo wzrostu poziomu skomplikowania oprogramowania.

Rynek IT nie lubi zbytniej jednorodności, nie jest zatem dziwne, że szybko pojawiło się kilka najważniejszych rodzin akceleratorów i koprocesorów graficznych, a inni producenci dostosowali swoje produkty tak, aby były zgodne albo sprzętowo (na poziomie rejestrów układu), albo programowo (na poziomie interfejsu sterownika pośredniczącego).

TIGA

Karta Texas Instruments Graphics Adapter ustanowiła standard przez krótką chwilę obowiązujący w świecie koprocesorów graficznych. Pełna możliwość programowania operacji graficznych pozwalała idealnie dostosować wydajność karty do potrzeb używanego programu, jednak stopień skomplikowania sterowników ograniczał wykorzystanie koprocesora w programach, zaś upowszechnienie się Windows (i innych popularnych, uniwersalnych środowisk graficznych) dobiło standard TIGA.

Ciekawostką była silna „wirtualizacja” urządzeń TIGA. Generalnie mogły one mieć dowolną rozdzielczość i głębię kolorów — oprogramowanie mogło odpytać kartę o możliwe tryby pracy i użyć dowolnego. Również sterowniki były zazwyczaj rozbite na dwa moduły, z których jeden dostarczany był przez producenta konkretnej karty i zajmował się tłumaczeniem standardowych odwołań TIGA w sposób zrozumiały dla zastosowanego procesora graficznego, a drugi za jego pośrednictwem nakazywał wykonywanie poleceń graficznych.

Cena kart TIGA nie przysporzyła im popularności, a rosnąca wydajność prostszych akceleratorów dopełniła dzieła.

IBM 8514/A

Wprowadzony w 1987 roku równolegle z VGA i wykorzystujący możliwości magistrali MCA (ang. Micro-Channel Architecture) komputerów PS/2, ten akcelerator firmy IBM był chyba pierwszym udostępniającym stały zestaw przyspieszanych funkcji graficznych. Zawieszony sprzetowo gdzieś pomiędzy światem akceleratorów i koprocesorów, udostępniał wszystkie swoje funkcje za pośrednictwem modułu 8514/AI (ang. Application Interface), programującego kartę i wywołującego określone funkcje. Dzięki temu karty innych producentów mogły działać odmiennie, mimo to zachowując zgodność z oryginałem.

Karta ATi 8514/Ultra
Karta graficzna ATi 8514/Ultra, zgodna z IBM 8514/A lecz przystosowana do 16-bitowej magistrali ISA

Karta 8514/A nie była samodzielną kartą graficzną. Łączona z kontrolerem VGA za pośrednictwem złącza typu Feature Connector (Auxiliary Video Extension, AVE), obsługiwała tylko własne tryby graficzne 640×480 i 1024×768 pikseli w 16 lub 256 kolorach (z czego tryb 1024×768 korzystał z przeplotu); pozostałe (z tekstowymi włącznie) pozostały w gestii równolegle pracującego sterownika VGA.

Interfejs programowania karty 8514/A został stworzony z myślą o programach do tworzenia grafiki wektorowej i przystosowany był głównie do operacji rysowania odcinków i krzywych oraz zapełniania obszarów. Niezwykle przydatną funkcją był też akcelerator operacji bit-blit (BitBlt), polegającej na przeniesieniu bloku obrazu z jednego miejsca w drugie (wykorzystywane jest to szczególnie przy przemieszczaniu okien po ekranie).

Choć oryginalna karta 8514/A nie zdobyła większej popularności, wielu producentów podchwyciło pomysł i zaoferowało własne karty zgodne z 8514/A, nie wymagające jednak magistrali MCA, zgodne z VGA i starszymi rozwiązaniami i oferujące dodatkowe możliwości. Najpopularniejszymi producentami „klonów” 8514/A były firmy ATi (seria Mach), Chips and Technologies oraz Western Digital. Oferowanie przez nich rozwiązania często były lepsze od oryginału, wyświetlając obraz w maksymalnej rozdzielczości bez przeplotu, akcelerując rysowanie czcionek z wykorzystaniem mechanizmu anti-aliasing (ATi Crystal Fonts) czy oferując szerszy wybór rozdzielczości obrazu.

IBM XGA

Koncern IBM zdał sobie sprawę z egzotyczności 8514/A, niskiej jakości obrazu wyświetlanego z przeplotem i niezbyt konkurencyjnej wydajności. Krokiem naprzód miał być kontroler obrazu XGA, wprowadzony na rynek (oczywiście w wersji MCA) w 1990 roku.

XGA – Extended Graphics Array – to już pełnoprawny, nowoczesny akcelerator graficzny. Zrezygnowano z pracy w tandemie z VGA, integrując kontroler VGA we wnętrzu układu. Wprowadzono rozdzielczość 800×600 pikseli z paletą 65 536 jednocześnie wyświetlanych barw (i pełną sprzętową akceleracją tego trybu) i utrzymano tryb 1024×768 pikseli w 256 kolorach, tym razem jednak bez wybierania międzyliniowego (przeplotu). Rozszerzono zakres akcelerowanych funkcji graficznych (między innymi o obsługę sprzętowego wskaźnika myszki), zachowując przy tym zgodność z interfejsem 8514/AI (a więc i oprogramowaniem napisanym z myślą o karcie 8514/A).

W kolejnym wcieleniu, XGA-2, jeszcze bardziej rozszerzono możliwości graficzne, wprowadzając tryby graficzne 640×480 pikseli z 24-bitowym opisem koloru (16 777 216 barw) i 1024×768 pikseli z 16-bitowym opisem koloru (65 536 barw) — oba oczywiście w pełni akcelerowane. Również prędkość działania karty uległa zauważalnej poprawie.

Era prostych akceleratorów graficznych

Wymienione powyżej standardy koprocesorów i akceleratorów graficznych miały niesamowite możliwości, jednak słono się za nie płaciło. Tymczasem przeciętnemu użytkownikowi nie były potrzebne układy graficzne akcelerujące sprzętowo każdą funkcję, jaką można sobie wymyśleć, tylko tanie karty zapewniające odpowiednie parametry obrazu i sensowną szybkość jego generowania. Nastąpiło starcie dwóch światów: tak zwane głupie bufory ramki (ang. dumb framebuffers) musiały „nauczyć się” od akceleratorów graficznych paru sztuczek przyspieszających tworzenie obrazu, nie tracąc jednak przy okazji swojej podstawowej zalety, jaką była śmiesznie niska cena.

Badania wykazały, że wystarczy przyspieszyć tylko kilka podstawowych typów operacji graficznych, by uzyskać niesamowity, zauważalny gołym okiem przyrost wydajności. Operacje te, wykorzystywane szczególnie intensywnie w zunifikowanych środowiskach graficznych typu Windows, to przede wszystkim:

Szybko zaczęły pojawiać się silnie zintegrowane (a więc tanie w produkcji) układy graficzne przyspieszające tylko tych kilka najprostszych operacji, pozostawiając rysowanie skomplikowanych wzorów geometrycznych, czcionek wektorowych i wypełnianie obszarów ograniczonych krzywymi procesorowi centralnemu. Pierwsze układy (takie jak S3 Vision) korzystały z drogiej dwuportowej pamięci VRAM, lecz kolejne (S3 Trio) z taniej i powszechnie dostępnej DRAM lub EDO DRAM. Stopniowemu rozszerzaniu ulegał też wachlarz akcelerowanych funkcji (elektronika jest tania), a w szczególności możliwości nakładkowania i skalowania obrazu wideo. Dalsze ograniczenie kosztów przyniosło zintegrowanie odrębnego dotychczas układu RAMDAC z wnętrzem układu.

Era pierwszych akceleratorów 3D

Rewolucja rozpoczęła się w roku 1996, gdy firma 3Dfx Interactive zaprezentowała zestaw układów scalonych o wspólnej nazwie Voodoo a firma Diamond Multimedia — zbudowaną w oparciu o niego kartę Diamond Monster. Ta dodatkowa karta rozszerzająca, przypominająca nieco 8514/A sposobem równoległej pracy z dowolną inną kartą zgodną z VGA (choć łączona z nią zwykłym przewodem sygnałowym VGA) rozszerzała znacząco możliwości graficzne komputera o funkcje związane z rysowaniem pseudo-trójwymiarowego obrazu na płaszczyźnie monitora. Procesor centralny ograniczony został do roli źródła danych opisujących trójwymiarowy świat: wierzchołków trójkątów, tekstur pokrywających je i miejsc występowania efektów specjalnych w stylu mgły.

Karta Diamond Monster
Karta Diamond Monster z dwuukładowym zestawem 3Dfx Voodoo I

Choć firma 3Dfx osiadła na laurach i szybko przestała się liczyć w świecie grafiki komputerowej, jej osiągnięcia kontynuowali inni. Na prowadzenie szybko wysunęła się nVidia, której rodzina układów Riva TNT pokonywała kolejne granice wydajności graficznej, a rodzina GeForce wprowadzała nowe funkcje odciążające procesor centralny (na przykład blok transformacji obrazu i źródeł światła, ang. Transform and Lighting). Po okresie stagnacji na konkurenta wyrósł jej koncern ATi z rodziną układów Radeon, a w międzyczasie na arenie pojawiali się inni jeszcze zawodnicy (Matrox, Intel, S3) z własnymi, najczęściej mało konkurencyjnymi rozwiązaniami.

Wszystkie te wczesne układy wspomagające tworzenie grafiki pseudo-trójwymiarowej miały jedną wspólną cechę: brak możliwości programowania. Stały zestaw funkcji pozwalał co prawda tworzyć dowolnego typu scenerię, jednak oprogramowanie jakichkolwiek zmiennych efektów wpływających na kształt obrazu wymagał za każdym razem angażowania procesora centralnego i modyfikowania parametrów przesyłanego opisu sceny.

Era nowoczesnych procesorów graficznych

Dzisiejsze karty graficzne coraz bardziej przypominają zaawansowane koprocesory graficzne z możliwością programowania ich działania. Coraz mniejszą wagę przykłada się też do trybu tworzenia grafiki płaskiej, skupiając wszystkie wysiłki na jak najsprawniejszej obsłudze grafiki pseudo-trójwymiarowej.

Wbrew pozorom nie zyskują na tym li tylko wielbiciele gier komputerowych. Nowoczesne interfejsy graficzne coraz częściej implementuje się w postaci zbioru prostokątnych obszarów odpowiadających oknom poszczególnych aplikacji, których zawartość wyświetlana jest jako tekstura. Również obraz wideo można w łatwy sposób wyświetlać, skalować i przekształcać traktując go jako teksturę wielokąta. Takie potraktowanie wciąż jeszcze płaskiego interfejsu użytkownika pozwala minimalnym nakładem pracy i bez angażowania procesora centralnego w dowolny sposób manipulować oknami, skalując je w czasie rzeczywistym, miotając nimi po ekranie i nakładając je na siebie z zachowaniem przezroczystości poszczególnych warstw i bez widocznego efektu odrysowywania odkrywanych obszarów ekranu.

Tym, co jednak naprawdę zmienia sposób tworzenia grafiki, są wprowadzane konsekwentnie możliwości programowania procesu zapełniania ekranu. Programy Pixel ShaderVertex Shader umożliwiają przeniesienie na układ graficzny sporej części odpowiedzialności za wygląd skomplikowanych brył. Zamiast podmieniania tekstur w celu uzyskania efektów specjalnych wystarczy uruchomić program shader dodający do dowolnej powierzchni efekt błysku, lustrzanego odbicia lub płomienia. Najważniejsze jest to, że takie programy wykonywane są w czasie rzeczywistym, podczas generowania sceny i nie wymagają czasochłonnego modyfikowania jej parametrów przed wyświetleniem każdej klatki.

Karty graficzne, których używamy dzisiaj, niczym nie przypominają skomplikowanych, lecz ubogich układów sprzed 20 lat. Dziś byle palmtop dysponuje wyższą rozdzielczością i liczbą kolorów niż karty EGA czy MCGA, a szybkość tworzenia wysokorozdzielczych obrazów przewyższa osiągnięcia wielu akceleratorów graficznych sprzed lat. Musimy tylko wykorzystać te możliwości, przenosząc jak najszybciej obsługę graficznych interfejsów użytkownika na barki procesora graficznego, nakazując mu składanie przezroczystych okien z tekstów i żonglowanie nimi.

Pierwszy krok został wykonany. System Mac OS X wykorzystuje możliwości programowania kart graficznych, używając procesora centralnego tylko w tak skrajnie skomplikowanych zadaniach jak rasteryzacja tekstu. Nieco mniejsze możliwości ma zapewniać Windows Vista, oferując „tylko” sprzętowo akcelerowane składanie obrazów okien (ang. compositing). Trwają też prace nad rozszerzeniem możliwości serwerów systemu X Window o składanie obrazów okien, a z wykorzystaniem biblioteki graficznej Cairo — również o sprzętowo akcelerowane rysowanie kształtów i czcionek. Wszystko po to, by skomplikowane, intuicyjnie zaprojektowane okna aplikacji rysowały się w oka mgnieniu, a obraz o wysokiej rozdzielczości jak najwierniej odwzorowywał wydruk.


Fantastyczny artykuł – pozwolił uzupełnić szczątkową wiedzę na temat tej fascynującej drogi: od zielonych literek na czarnym tle do GF7800GT i milionów wielokątów generowanych w ułamkach sekund ;-)

Pozdrawiam ;)
Czytam już któryś z rzędu pański artykuł i jestem pod wielkim wrażeniem :). Naprawde gratuluje wiedzy a przede wszystkim bardzo dobrego języka inżyniera, o którym sam co nieco wiem. Oby tak dalej. Pozdrawiam!