background image

 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

background image

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

background image

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

background image

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