OpenGL (część 1) – wstęp

Zaczynając serię o programowaniu w OpenGL należy najpierw uściślić co to jest. Otóż powszechnie się uważa, że OpenGL jest interfejsem do programowania apilacji (ang. API – Application Programming Interface). Jednak nie jest to API, lecz specyfikacja, która została opracowana w firmie Silicon Graphics a teraz jest utrzymywana przez Khronos Group.

Specyfikacja ma to do siebie, że określa sposób działania każdej z funkcji i jej rezultat. Specyfikacja OpenGL nie określa szczegółów implementacji. Jest to w gestii programisty. Poszczególne biblioteki do obsługi tej specyfikacji są opracowywane przez producentów kart graficznych. I tak Microsoft opracowuje swoje biblioteki, Apple swoje, a dla linuksa są biblioteki producentów kart graficznych oraz napisane przez programistów w ramach open source.

Khronos Group udostępnia dokumentację specyfikacji wszystkich wersji OpenGL. W tej serii artykułów będziemy korzystać z wersji 3 i 4. Jeżeli więc znasz „starego” OpenGL-a i kojarzy się on Tobie z czymś w postaci glBegin(), to zapomnij o tych zabytkach z wersji 1 oraz 2. Będziemy się tu zajmować „nowym” OpenGL-em. W odnowionej wersji specyfikacji używa się nowoczesnych praktyk. Jest to podejście wydajne, ale nieco trudniejsze od OpenGL-a starych wersji. Podstawową nową wersją jest OpenGL 3.3, a wszystkie nowsze wersje są jej uzupełnieniem, nie zmieniając podstawowej mechaniki programowania.

Rozszerzenia

Obsługa rozszerzeń jest bardzo użyteczną cechą OpenGL. Kiedy producent opracuje nową technikę lub optymalizację renderowania występuje ona w rozszerzeniu zaimplementowanym w najnowszych sterownikach. Jeżeli twój sprzęt obsługuje to rozszerzenie, to z niego możesz korzystać sprawdzając czy jest obsługiwane przez sprzęt. Jeżeli nie, to można korzystać ze starszych technik rozszerzeń. Jeżeli jakieś rozszerzenie jest bardzo przydatne, lub staje się popularne, wchodzi do następnych wersji specyfikacji OpenGL, Można na przykład zrobić tak jeżeli chcemy sprawdzić rozszerzenie GL_AMD_gcn_shader (albo jakiekolwiek inne):

if (GL_AMD_gcn_shader){
        // użyj nowego mega softu wspieranego przez hardware
    } else {
        // nowoczesne rozszerzenie nie jest wspierane - zrób to po staremu
    }

Nowy OpenGL rzadko wymaga rozszerzeń w zwykłych zastosowaniach.

Maszyna stanów

Pojęcie maszyny stanów jest bardzo ważne, aby zrozumieć, jak działa OpenGL. Jest on bowiem zbiorem zmiennych, które określają jak powinien działać. Stan OpenGL jest nazywany kontekstem. Korzystając ze specyfikacji zmieniamy stan ustawiając poszczególne opcje. Manipulujemy buforami, a następnie dokonujemy renderowania za pomocą bieżącego kontekstu. Jeżeli rysujemy trójkąty, a następnie zmieniamy na rysowanie linii, to dokonujemy zmiany stanu OpenGL-a. Jedne funkcje zatem zmieniają stan, a inne go wykorzystują. Używając OpenGL-a trzeba zatem pamiętać, że jest to jedna wielka maszyna stanów. Wtedy jego funkcje można łatwo zrozumieć.

Obiektowość

Biblioteki OpenGL są napisane w języku C. Dzięki temu można z nich korzystać nie tylko w C, ale i w C++. Niestety C ma swoje ograniczenia – nie jest językiem obiektowym. Stąd OpenGL nie ma obiektowości w sensie współczesnych języków wysokiego poziomu. Dlatego pisząc w C++ program używający OpenGL nie będziemy stosować class, lecz struct. To jest właściwy poziom abstrakcji w tym przypadku. Obiekt OpenGL jest swoistym zbiorem funkcji, które opisują stan. Jeżeli używamy obiektów OpenGL (celowo nie piszę obiektowego OpenGL, bo taki nie jest) wygląda to tak:

struct object_name {
    float  option1;
    int    option2;
    char name[];
};

Obiekty OpenGL-a wizualizujmy zatem jako struktury języka C/C++, ale nie jako klasy C++. Nie jest on w takim sensie obiektowy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *