Strona główna
Kursy
Artykuły
Forum
Pliki
Promuj Nas!
[Kurs OpenGL, C++] I. Podstawy
http://kursy.ddt.pl/?LessonId=167
1 z 4
2010-04-30 14:21
Powrót
Historia odwiedzonych stron
Kurs OpenGL, C++
Następna lekcja
Autor: Janusz Ganczarski
http://januszg.hg.pl/opengl/
I. Podstawy
Pierwsza wersja biblioteka OpenGL (ang. Open Graphics Library) powstała w 1992 roku na bazie jezyka
GL opracowanego przez firme Silicon Graphics Inc. (w skrócie SGI) na potrzeby stacji graficznych IRIS. Dopiero
jednak sukces systemów z rodziny Microsoft Windows, w których zaimplementowano OpenGL w wersji 1.1, stał
sie poczatkiem ogromnej popularności biblioteki. Obecnie OpenGL jest podstawowa niskopoziomowa biblioteka
graficzna 3D, obsługiwana przez wszystkie liczace sie systemy operacyjne oraz większość procesorów
graficznych. Niezaleznosc od platformy sprzetowej oraz ogólnie dostepna specyfikacji czyni z OpenGL standard
powszechnie wykorzystywany przez producentów oprogramowania uzytkowego i gier. Rozwojem OpenGL
zajmuje sie organizacja ARB (ang. Architecture Review
Board), w skład której wchodza przedstawiciele firm 3DLabs, Apple, ATI, Dell, IBM, Intel, NVIDIA, SGI i
Sun (stan na koniec 2004 roku). Taki sposób wprowadzania zmian w bibliotece zapewnia zachowanie
niezależności OpenGL od jednej platformy sprzetowej lub programowej przy
jednoczesnym uwzglednieniu do najnowszych osiagniec w dziedzinie grafiki komputerowej. Materiały ze
spotkan członków ARB, specyfikacje i szeregu innych materiałów na temat OpenGL dostepne sa na oficjalnej
stronie ARB: http://www.opengl.org/. Waznym uzupełnieniem OpenGL jest biblioteka GLU (ang. OpenGL
Graphics System Utility Library). GLU zawiera szereg dodatkowych narzedzi, w tym do obsługi macierzy,
odwzorowania tekstur, kafelkowania wielokatów, powierzchni drugiego stopnia oraz krzywych i powierzchni
NURBS.
1.1. Składnia
Polecenia OpenGL okreslane sa jako funkcje lub procedury. Znaczna czesc funkcji wykonuje te same
operacje, ale rózni sie zbiorem argumentów. Przyjeta konwencja nazewnictwa okresla ilosc i rodzaj parametrów
funkcji według ponizszego schematu:
rtype Name {1|2|3|4} {b|s|i|f|d|ub|us|ui} {v}
([args,] T arg1, ..., T argN [,args])
gdzie poszczególne elementy oznaczaja:
rtype - wartosc zwracana przez funkcje,
Name - nazwa funkcji poprzedzona przedrostkiem gl lub glu dla funkcji z biblioteki GLU,
1, 2, 3, 4 - ilosc argumentów funkcji,
b - argumenty typu GLbyte,
s - argumenty typu GLshort,
i - argumenty typu GLint,
f - argumenty typu GLfloat,
d - argumenty typu GLdouble,
ub - argumenty typu GLubyte,
us - argumenty typu GLushort,
ui - argumenty typu GLuint,
v - argument funkcji stanowi tablica wartosci; w tym wypadku nie wystepuje okreslenie ilosci
argumentów funkcji,
T arg1, ..., T argN - argumenty funkcji.
Składnia ta przypomina w swoich załozeniach notacje wegierska, stosowana m.in. w API systemów z
rodziny Windows. Moze ona początkowo sprawiac problemy, ale przy pewnej praktyce okazuje sie praktyczna i
wygodna w stosowaniu. Podobnie jak w specyfikacja biblioteki OpenGL ta i dalsza
czesc opisu wykorzystuje notacje przyjeta w jezyku ANSI C.
1.2. Typy danych
Tabela 1 zawiera typy danych dostepne w bibliotece OpenGL.
typ OpenGL
minimalna
ilość
bitów
opis
GLboolean
1
typ logiczny
GLbyte
8
liczba całkowita ze znakiem (U2)
GLubyte
8
liczba całkowita bez znaku
GLchar
8
ciag znaków tekstowych
GLshort
16
liczba całkowita ze znakiem (U2)
GLushort
16
liczba całkowita bez znaku
GLint
32
liczba całkowita ze znakiem (U2)
GLuint
32
liczba całkowita bez znaku
GLsizei
32
nieujemna liczba całkowita
GLenum
32
typ wyliczeniowy całkowity
GLintptr
ptrbits
wskaznik na liczbe całowita ze znakiem (U2)
GLsizeiptr
ptrbits
wskaznik na nieujemna liczbe całkowita
GLbitfield
32
pole bitowe
GLfloat
32
liczba zmiennoprzecinkowa
GLclampf
32
liczba zmiennoprzecinkowa z przedziału [0, 1]
P anel Logowania
dast19
Administracja
Twój profil
Wyloguj
Uż yt kowników
Obecnie aktywnych:
16
Zalogowanych:
2
Zarejestrowanych:
3855
Ostatnie 24h:
646
Non-cookie 24h:
2051
Wszystkich:
178944
O c z e kuj ąc e t e mat y
Lista jest pusta.
Pokaż wszystkie (0)
Os tatnia Aktualizacja
2010-04-29 22:01:07
(wczoraj)
O st atnio akt ywni
dast19
0 min
Piotr Szawdyński
3 min
Iname
(√ιק)
15 min
szywro5
27 min
Saiph
32 min
markon
55 min
imandre
73 min
WunM
91 min
kuba1817
2 godz
killersft
2 godz
fish13
2 godz
kizia
2 godz
Kurs programowania w
C++
Wygodna Metoda nauczania.
Poznaj Tajniki języka C++
www.SzkolaLinuxa.pl
Programista Aplikacji
WWW
3-miesięczne szkolenie z
PHP, SQL, PostgreSQL.
Warszawa, Kraków
akademia-php.pl
[Kurs OpenGL, C++] I. Podstawy
http://kursy.ddt.pl/?LessonId=167
2 z 4
2010-04-30 14:21
GLdouble
64
liczba zmiennoprzecinkowa
GLclampd
64
liczba zmiennoprzecinkowa z przedziału [0, 1]
Tabela 1: Typy danych w OpenGL
Specyfikacja nie okresla jakiego rodzaju typy danych sa uzyte w konkretnej implementacji biblioteki
OpenGL.Wszczególnosci typy danych OpenGL nie sa typami danych wystepujacymi w jezyku C (pomimo
czesciowej zgodności nazw). Implementacja OpenGL moze stosowac typy danych zawierające wieksza niz
minimalna ilosc bitów. prtbits oznacza minimalna ilosc bitów niezbedna do umieszczenia wskaznika. Stad typy
intptr i sizeiptr musza umozliwic zapamietanie dowolnego adresu. Poza wyzej wymienionymi typami danych
biblioteka OpenGL zawiera typ pusty GLvoid.
1.3. Układ współrzędnych
Biblioteka OpenGL stosuje prawoskretny układ współrzednych kartezjańskich (patrz rysunek 1), w którym
os OZ skierowana jest prostopadle do płaszczyzny monitora. Warto takze pamietac, ze literatura informatyczna
preferuje lewoskretne układy współrzednych z osia OZ skierowana w głab monitora.
Rysunek 1. Układ współrzędnych w OpenGL
1.4. Barwy
Biblioteka OpenGL wykorzystuje model barw RGB, opierajacy sie na trzech podstawowych barwach:
czerwonej, zielonej i niebieskiej. Barwa może byc opisywana bezposrednio przez wartosci składowych RGB,
badz w trybie indeksowym z uzyciem mapy (tablicy) barw. Obecne mozliwosci procesorów graficznych czynia
stosowanie trybu indeksowego nieopłacalnym, stad w przykładowych programach bedziemy uzywac pełnego
zakresu barw oferowanego przez model RGB, w razie potrzeby uzupełniajac składowe RGB o kanał alfa
(RGBA). Wybór trybu w jakim bedzie generowany obraz dokonywany jest podczas tworzenia okna renderingu.
1.5. Bufor ramki
W OpenGL w skład bufora ramki (pamieci obrazu) wchodza następujące elementy:
bufor koloru (ang. color buffer),
bufor głebokosci, nazywany takze buforem głebi (ang. depth buffer),
bufor szablonowy, nazywany takze buforem szablonu (ang. stencil buffer),
bufor akumulacyjny (ang. accumulation buffer).
Specyfikacja wymaga istnienie co najmniej jednego bufora koloru, ale implementacje biblioteki OpenGL
zawieraja najczesciej dwa bufory koloru: przedni i tylni. Zamiana buforów umozliwia płynne wyswietlenie
animacji - jeden bufor jest aktualnie prezentowany na ekranie monitora, a drugi słuzy do generowania nowej
sceny 3D. Ponadto implementacja OpenGL może zawierac lewe i prawe bufory koloru, które umozliwiaja
tworzenie obrazów stereoskopowych. Bufor głebokosci uzywany jest podczas działania algorytmu Z-bufor,
którego zadaniem jest ukrywanie niewidocznych powierzchni. Bufor szablonu słuzy do ograniczenia obszaru
renderingu do wybranej czesci okna i w implementacjach czesto jest łaczony z buforem głebokosci. Ostatni z
wymienionych elementów ramki - bufor akumulacyjny, umozliwia łaczenie kilku obrazów w celu uzyskania
okreslonego efektu koncowego. Wybór, które bufory wchodza w skład ramki dokonuje sie podczas tworzenia
okna renderingu.
1.6. Okno renderingu
Jedna z konsekwencji sprzetowej i systemowej niezaleznosci biblioteki OpenGL jest brak jakichkolwiek
funkcji obsługujacych komunikacje z uzytkownikiem, w tym obsługi okien, klawiatury i myszki. Wiekszosc
graficznych systemów operacyjnych posiada jednak specjalizowane funkcje pozwalające na obsługe okna
renderingu OpenGL. Przykładowo X Windows zawiera biblioteke GLX, Microsoft Windows biblioteke WGL,
IBM OS/2 biblioteke PGL, a Mac OS X az trzy biblioteki: AGL, CGL i NSGL. Takze systemy wbudowane,
korzystajace ze znacznie skromniejszej biblioteki OpenGL ES (ang. OpenGL Embedded Systems), zawieraja
biblioteke narzedziowa EGL. Oczywiscie stosowanie rozwiazan specyficznych dla danego systemu operacyjnego
powoduje, ze danego programu nie mozna skompilowac i uruchomic w innym systemie operacyjnym bez
dokonania szeregu zmian w tekscie zródłowym. Rozwiazanie tego problemu stanowia biblioteki oferujace jeden,
niezalezny od systemu operacyjnego, interfejs do obsługi okien i komunikatów.
Pierwsza biblioteka tego typu była biblioteka AUX (ang. Auxiliary Library), zwana takze pod nazwa
[Kurs OpenGL, C++] I. Podstawy
http://kursy.ddt.pl/?LessonId=167
3 z 4
2010-04-30 14:21
GLAUX. Przy jej pomocy zostały napisane m.in. przykłady z pracy [3]. Jednak najwieksza popularnosc zdobyła
biblioteka GLUT (ang. OpenGL Utility Toolkit), opracowana i rozwijana w latach 1994-1998 przez Marka J.
Kilgarda. Jej autor rozwinał idee zapoczątkowane przez twórców biblioteki AUX, co ułatwia konwersje
programów korzystających z tej biblioteki (patrz skrypt aux2glut.sed). Bibliotek GLUT, choc od kilku lat nie
rozwijana (ostatnia wersja to 3.6), jest ciagle najbardziej popularna i powszechnie stosowana wieloplatformowa
biblioteka słuzaca do uruchamiania programów w OpenGL. Stad naturalna decyzja o wyborze tej biblioteki przy
pisaniu przykładowych programów.
1.7. Maszyna stanów
Maszyna stanów OpenGL to po prostu zbiór wszystkich zmiennych wewnętrznych (zmiennych stanu) i
ustawien biblioteki. Wiele zmiennych stanu jest dwustanowych, inne maja wartosci całkowite lub
zmiennoprzecinkowe. Wazna cecha maszyny stanów OpenGL jest zachowywanie zmiennych stanu do czasu, az
zostana one zmienione przez jakas funkcje. Pozwala to na prosta optymalizacje programów poprzez oddzielenie i
jednokrotne wywołanie grupy funkcji ustawiajacych wartosci tych zmiennych stanu, które nie ulegaja dalszym
zmianom.
1.8. Obsługa błędów
Wazne znaczenie w bibliotece OpenGL spełniaja zmienne stanu oznaczające wystapienie błedu. Informacje
o kodzie biezacego błedu zwraca funkcja:
GLenum glGetError (
void
)
Oto znaczenie poszczególnych kodów błedów:
GL NO ERROR - brak błedu,
GL INVALID ENUM - argument typu wyliczeniowego poza dopuszczalnym zakresem,
GL INVALID VALUE - argument liczbowy poza dopuszczalnym zakresem,
GL INVALID OPERATION - operacja niewykonalna w obecnym stanie,
GL STACK OVERFLOW - operacja spowodowałaby przepełnienie stosu,
GL STACK UNDERFLOW - operacja spowodowałaby niedomiar stosu,
GL OUT OF MEMORY - brakuje pamieci do wykonania operacji,
GL TABLE TOO LARGE - wskazana tablica jest za duza.
Wystapienie błedu nie powoduje przerwania wykonywania programu - nie jest wykonywana jedynie funkcja
odpowiedzialna za jego powstanie. Wyjatek stanowi wystapienie błedu o kodzie GL OUT OF MEMORY, który
powoduje powstanie stanu nieokreslonego. Uwage nalezy zwrócic na mechanizm przechowywania kodów
błedów. Kazdy rodzaj błedu jest oddzielnie zapamietywany, a kazdorazowe wywołanie funkcji glGetError zwraca
kod tylko jednego błedu. Stad w przypadku sprawdzania wystapienia błedu niezbedne jest wywoływanie funkcji
glGetError tak długo, az zwrócona zostanie wartosc GL NO ERROR. Biblioteka GLU ma odrebne kody błedów
bedace odpowiednikami kodów błedów OpenGL: GLU INVALID OPERATION, GLU INVALID ENUM, GLU -
INVALID VALUE i GLU OUT OF MEMORY. Ciag znaków opisujacy kod błedu biblioteki OpenGL oraz GLU,
wskazany w parametrze errorCode, zwraca funkcja:
const
GLubyte *gluErrorString (GLenum errorCode)
Przykładowo bład o kodzie GL INVALID VALUE spowoduje zwócenie ciagu znaków „invalid value”.
1.9. Źródło materiału
Materiał został pobrany ze strony
http://januszg.hg.pl/opengl/
, za uprzednim otrzymaniem zgody od jego
autora. Podziekowania dla
Janusza Ganczarskiego
za udostępnienie materiałów
Kurs OpenGL, C++
Następna lekcja
Wsz e lkie prawa z ast rz e ż one . Aut or: ź ródło z e wnę t rz ne
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub
rozpowszechnianie treści bez wyraźnej zgody jego autora jest zabronione.
Powrót
Historia odwiedzonych stron
O portalu
Archiwum
Historia
Indeks
Regulamin
Wyszukiwarka
Linki
© Wszelkie prawa zastrzeżone 2005-2010
Czas wygenerowania strony: 0.054s
Autor: Piotr Szawdyński
[Kurs OpenGL, C++] I. Podstawy
http://kursy.ddt.pl/?LessonId=167
4 z 4
2010-04-30 14:21