OpenGL - Tutorial (Na Pods. Ks. Ex.)

37
  0  Tutorial OpenGL i GLUT Na podstawie ksiki – OpenGL Ksi ga eksperta - Helion SPIS TRECI: 1. Szczegóły interfejsu .............................................................................................. 1 1.1. Typy danych ............................................................................................... 1 1.2. Konwencje nazewnictwa funkcji ............................................................... 2 2. Nasz pierwszy program ......................................................................................... 4 3. Rysowanie kształtów w OpenGL.......................................................................... 7 4. Animacja w OpenGL i GLUT............................................................................... 13 4.1. Podwójne buforowanie ............................................................................... 15 5. Maszyna stanów .................................................................................................... 15 5.1. Zapisywanie i odtwarzanie stanów ............................................................ 16 6. Rysowanie 3D ....................................................................................................... 17 6.1. Rysowanie punktów ................................................................................... 17 6.2. Ustalanie wielkoci punktów ..................................................................... 19 6.3. Rysowanie linii w trzech wymiarach ......................................................... 22 6.4. Linie łamane i zamkni te......... ................................................................... 22 6.5. Aproksymacja krzywy ch liniami prostymi ................................................ 23 6.6. Ustalanie szerokoci lin ii ........................................................................... 23 6.7. Rysowanie trójk  tów w trzech wymiar ach ................................................ 24 6.7.1. Trójk  t – mój pierwszy wielok  t ..................................................... 25 6.7.2. Nawini cie ....................................................................................... 25 6.7.3. Trójk  ty sklejane ............................................................................. 26 6.7.4. Wachlarze trójk  tów ........................................................................ 27 6.8. Budowanie p ełnych obiektów .................................................................... 27 6.9. Ustalenie koloru wielok  ta ......................................................................... 29 7. Tekstury ................................................................................................................. 29 7.1. Ład owanie tekstur ...................................................................................... 29 7.2. Odwzorowywanie tekstur na obiekty geometryczne ................................. 32 7.3. Macierze tekstur ......................................................................................... 33 7.4. Prosty przykład dwuwymiarowy.................. .............................................. 33

Transcript of OpenGL - Tutorial (Na Pods. Ks. Ex.)

Na podstawie ksi ki OpenGL Ksi ga eksperta - Helion

Tutorial OpenGL i GLUT

SPIS TRE CI:1. Szczegy interfejsu .............................................................................................. 1 1.1. Typy danych ............................................................................................... 1 1.2. Konwencje nazewnictwa funkcji ............................................................... 2 2. Nasz pierwszy program......................................................................................... 4 3. Rysowanie ksztatw w OpenGL.......................................................................... 7 4. Animacja w OpenGL i GLUT............................................................................... 13 4.1. Podwjne buforowanie............................................................................... 15 5. Maszyna stanw .................................................................................................... 15 5.1. Zapisywanie i odtwarzanie stanw ............................................................ 16 6. Rysowanie 3D ....................................................................................................... 17 6.1. Rysowanie punktw ................................................................................... 17 6.2. Ustalanie wielko ci punktw ..................................................................... 19 6.3. Rysowanie linii w trzech wymiarach ......................................................... 22 6.4. Linie amane i zamkni te............................................................................ 22 6.5. Aproksymacja krzywych liniami prostymi ................................................ 23 6.6. Ustalanie szeroko ci linii ........................................................................... 23 6.7. Rysowanie trjk tw w trzech wymiarach ................................................ 24 6.7.1. Trjk t mj pierwszy wielok t ..................................................... 25 6.7.2. Nawini cie ....................................................................................... 25 6.7.3. Trjk ty sklejane ............................................................................. 26 6.7.4. Wachlarze trjk tw........................................................................ 27 6.8. Budowanie penych obiektw .................................................................... 27 6.9. Ustalenie koloru wielok ta......................................................................... 29 7. Tekstury................................................................................................................. 29 7.1. adowanie tekstur ...................................................................................... 29 7.2. Odwzorowywanie tekstur na obiekty geometryczne ................................. 32 7.3. Macierze tekstur ......................................................................................... 33 7.4. Prosty przykad dwuwymiarowy................................................................ 33

0

Szczegy interfejsuBiblioteka OpenGL zostaa zaprojektowana przez uczonych ludzi posiadaj cych wiele do wiadczenia w projektowaniu interfejsw programowania grafiki. Zastosowali oni standardowe reguy nazewnictwa funkcji i deklarowania zmiennych. Powstae API jest bardzo proste i przejrzyste, a na dodatek pozwala r nym dostawcom w atwy sposb rozbudowywa bibliotek . OpenGL stara si nakada jak najmniej zasad. Zasadami okre lane s zao enia, jakie projektanci biblioteki poczynili w zakresie metod wykorzystania API przez u ytkownikw. Przykadami takich zasad mog by zao enia, e dane wierzchokw b d zawsze definiowane jako warto ci zmiennoprzecinkowe, przed w czeniem rendcringu mga b dzie zawsze w czona albo e wszystkie obiekty na scenie obj te s tymi samymi parametrami o wietlenia. Takie zao enia mogyby wyeliminowa wiele z popularnych technik renderowania powstaych z biegiem czasu.

Typy danychAby uatwi przenoszenie kodu korzystaj cego z OpenGL na inne platformy biblioteka definiuje swoje wasne typy danych. Typy te wynikaj z normalnych typw danych j zyka C, ktrych mo na u ywa zamiennie, je eli zajdzie taka potrzeba. Trzeba jednak pami ta , e r ne kompilatory i rodowiska stosuj swoje wasne zasady definiuj ce wielko i uo enie w pami ci typw danych j zyka C. Stosowanie typw danych definiowanych przez OpenGL pozwala odizolowa nasz kod od tego rodzaju zmian. W tabeli 2.1 wypisano typy danych biblioteki OpenGL i odpowiadaj ce im typy danych j zyka C w 32-bitowych rodowiskach Windows (Win32), a tak e przedrostki literaw. W tym tutorialu b dziemy u ywa tych przedrostkw w nazwach wszystkich literaw. Jak b dzie mo na zauwa y p niej, te same przedrostki stosowane s rwnie w nazwach wielu funkcji biblioteki OpenGL.

1

Wszystkie typy danych zaczynaj si od liter GL, co oznacza, e pochodz z biblioteki OpenGL. W wi kszo ci przypadkw za tymi literami znajduje si nazwa odpowiadaj cego im typu danych j zyka C (by te, short, int, float itd.). Litera u umieszczona przed niektrymi z tych nazw informuje nas, e jest to typ danych bez znaku, na przykad ubyte oznacza bajt bez znaku (unsigned byte). Do niektrych zastosowa przygotowano bardziej opisowe nazwy, takie jak size do oznaczania warto ci dugo ci lub g boko ci. Na przykad typ Glsizei stosowany jest do oznaczania parametrw rozrrtiaru opisywanego liczb cakowit . Oznaczenie clamp jest wskazwk , e warto po\yinna by ci ni ta w zakresie do 0.0 - 1.0. Zmienne Glboolean u ywane s do przechowywania warto ci logicznych, typ GLenum przeznaczony jest dla zmiennych wyliczeniowych, a GLbit field dla zmiennych zawieraj cych pola bitowe. Wska niki i tablice nie otrzymay deklarowana jest po prostu jako: GLshort shorts[10]; natomiast tablica dziesi ciu wska nikw na warto ci GLdoubl e deklarowana jest nast puj co: GLdouble *doubles[10]; adnych specjalnych oznacze . Tablice dziesi ciu zmiennych typu GLshort

Konwencje nazewnictwa funkcjiDla wi kszo ci funkcji OpenGL zastosowano konwencje nazewnicze informuj ce nas, z jakiej biblioteki pochodzi dana funkcja, a cz sto przekazuj ce te informacje o liczbie i typie pobieranych parametrw. Wszystkie funkcje posiadaj rdze nazwy reprezentuj cy polecenie OpenGL odpowiadaj ce danej funkcji. Na przykad rdzeniem nazwy funkcji glColor3f" jest polecenie Color. Przedrostek gl oznacza, e funkcja pochodzi z biblioteki gl, a przyrostek 3f mwi, e funkcja pobiera trzy parametry zmiennoprzecin-kowe. Nazwy wszystkich funkcji OpenGL tworzone s zgodnie z poni szym formatem: Rysunek 2.4 przedstawia poszczeglne elementy nazwy funkcji OpenGL. Przykadowa funkcja z przyrostkiem 3f pobiera trzy parametry zmiennoprzecinkowe. Inne warianty pobieraj trzy liczby cakowite (glColor3i), trzy liczby zmiennoprzecinkowe podwjnej precyzji (glColor3d) itd. Konwencja dodawania do nazwy funkcji liczby i typw parametrw (tabela 2.1) bardzo uatwia zapami tanie listy parametrw funkcji bez konieczno ci przegl dania dokumentacji. Niektre wersje funkcji gl Color pobieraj te czwarty parametr, oznaczaj cy skadow alfa (przezroczysto ).

Wiele kompilatorw C/C++ w systemach Windows zakada, e ka da podawana jawnie warto zmiennoprzecinkowajest typu double, chyba e zostanie podany inny typ. Stosuj c literay warto ci zmiennoprzecinkowych z pomini ciem okre lenia, e s to warto ci typu float, a nie double, otrzymamy od kompilatora ostrze enie mwi ce o tym, e prbujemy przekaza warto typu double do parametru typu float, co grozi utrat precyzji liczby. Wraz z rozrastaniem si programw korzystaj cych z OpenGL liczba takich ostrze e szybko ro nie w setki, co znacznie utrudnia wyszukiwanie rzeczywistych b dw. Oczywi cie mo na wy czy te ostrze enia za pomoc odpowiedniej opcji kompilatora, ale zdecydowanie odradzamy ten sposb zaatwiania sprawy. Znacznie lepszym rozwi zaniem jest tworzenie przejrzystego i przeno nego kodu, dlatego nale y usuwa te ostrze enia poprzez

2

wyczyszczenie kodu (w tym przypadku, poprzez okre lanie typu float przy literaach warto ci zmiennoprzecinkowych), a nie wy czanie potencjalnie przydatnych ostrze e . Poza tym, mo na ulec pokusie u ywania wy cznie funkcji pobieraj cych liczby zmien-noprzecinkowe o podwjnej precyzji i nie zawraca sobie gowy podawaniem typu ka dej wpisywanej jawnie warto ci. Niestety, biblioteka OpenGL wewn trznie u ywa warto ci typu float, wi c u ywanie warto ci innych ni float powoduje zmniejszenie wydajno ci, poniewa musz by one cay czas konwertowane na odpowiedni posta , zanim biblioteka b dzie moga si nimi zaj (nie wspominaj c nawet o tym, e zmienne typu double zajmuj dwa razy wi cej miejsca ni zmienne typu float). W programie, w ktrym przerzucanych" jest wiele takich liczb, mo e to mie znacz cy wpyw na wydajno !

3

Nasz pierwszy programW celu lepszego poznania biblioteki GLUT przyjrzyjmy si teraz prawdopodobnie najmniejszemu na wiecie programowi korzystaj cemu z OpenGL, ktry napisany zosta z wykorzystaniem biblioteki GLUT. Na poni szym listingu przedstawiono program SIMPLE. Przy okazji dowiemy si kilku nowych rzeczy o bibliotece OpenGL!

#include // Funkcja wywoywana w celu narysowania sceny void RenderScene(void) { // Wyczyszczenie okna aktualnym kolorem czyszcz cym glClear(GL_COLOR_BUFFER_BIT); /// Przekazanie polecenia czyszczenia do wykonania glFlush(); } // Ustalenie stanu rendrowania void SetupRC(void) { glClearColor(0.0f,0.0f,1.0f,1.0f): } // Gwny punki wej cia programu void main(void) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA): glutCreateWi ndow("Si mple"); glutDi splayFunct RenderScene): SetupRC(): glutMainLoo(); }

Program SIMPLE nie robi zbyt wiele. Po uruchomieniu z poziomu wiersza polece (lub rodowiska programistycznego) tworzy tylko standardowe okno interfejsu GUI z nagwkiem Simple i pustym niebieskim tem. Je eli uruchomiony zosta z poziomu Visual C++. to po jego zako czeniu w oknie konsoli pojawi si komunikat Press any key. Aby cakowicie zamkn program, konieczne b dzie naci ni cie dowolnego klawisza. Ta standardowa funkcja rodowiska programistycznego Microsoftu u ywana w czasie uruchamiania programw konsolowych ma na celu umo liwienie nam przejrzenia wszystkich komunikatw jakie mg wygenerowa program, zanim jego okno zniknie z ekranu. Je eli ten sam program uruchomimy z poziomu wiersza polece , to nie stwierdzimy takiego zachowania. Je eli klikniemy dwukrotnie plik w Eksploratorze, to zobaczymy co prawda okno konsoli, ale zniknie ono w momencie zamkni cia programu. Ten prosty program korzysta z czterech funkcji biblioteki GLUT (oznaczonych przedrostkiem glut) i trzech prawdziwych" funkcji OpenGL (z przedrostkiem gl). Przejrzyjmy teraz program wiersz po wierszu, a p niej wprowadzimy do niego kilka dodatkowych funkcji i podniesiemy jako naszego pierwszego przykadu.

NagwekPowy szy kod zawiera tylko jedn instrukcj w czenia pliku nagwkowego:#include

Plik ten w cza w siebie pliki nagwkowe gl.h i glut.h, w ktrych zapisane s prototypy funkcji u ywanych w programie.

CiaoNast pnie przejdziemy do punku wej cia wszystkich programw j zyka C:void main(void)

Wykonywanie programw w C i C++ dziaaj cych w trybie konsoli zawsze rozpoczyna si od funkcji mai n. Do wiadczeni programi ci tworz cy w systemie Windows mog zastanawia si , gdzie podziaa si funkcja WinMain.

4

Nie ma jej, poniewa uruchamiana jest aplikacja konsolowa, wi c nie musimy tworzy adnego okna, ani obsugiwa kolejki komunikatw. Za pomoc Win32 mo liwe jest tworzenie okien graficznych z poziomu aplikacji konsolowej, podobnie jak mo na tworzy okna konsoli z poziomu aplikacji z interfejsem GUI. Wszystkie szczegy zapisane s wewn trz biblioteki GLUT. Trzeba pami ta , e ta biblioteka zostaa zaprojektowana tak, eby ukrywa te wa nie szczegy dziaania platformy.

Tryb wy wietlania pojedynczy buforW przedstawionej tutaj pierwszej linii kodu przekazujemy bibliotece GLUT informacj , jakiego trybu wy wietlania ma u ywa w czasie tworzenia okna:glutlnitDisplayMode(GLUT SINGLE | GLUTRGBA);

Podane tu znaczniki nakazuj bibliotece u ywa okna z pojedynczym buforem (GLUT_SINGLE) i trybu kolorw RGBA (GLUT_RGBA). Okno z pojedynczym buforem oznacza, e wszystkie polecenia rysowania wykonywane s na wy wietlanym wa nie oknie. Alternatyw jest okno z podwjnym buforowaniem, w ktrym polecenia rysowania wykonywane s na nie wy wietlanym buforze, ktry jest nast pnie szybko przekazywany do widocznego okna. Ta metoda jest cz sto stosowana do uzyskania efektu animacji, a jej zastosowanie demonstrowane jest w dalszej cz ci tego rozdziau. Tak naprawd to trybu podwjnego buforowania b dziemy u ywa we wszystkich pozostaych przykadach w tym tutorialu. Tryb koloru RGBA oznacza, e musimy osobno podawa intensywno ci wszystkich skadowych koloru czerwonej (red), zielonej (green) i niebieskiej (blue). Alternatywnym trybem jest, aktualnie bardzo przestarzay, tryb indeksowany, w ktrym podawany jest numer koloru we wcze niej zdefiniowanej palecie.

Tworzenie okna OpenGLNast pne wywoanie funkcji z biblioteki GLUT tworzy okno na ekranie. Poni sze polecenie tworzy nowe okno i nadaje mu nagwek Simple:glutCreateWindow("Simple");

W jedynym parametrze funkcji glutCreateWindow przekazywany jest tekst nagwka tworzonego okna.

Wy wietlaj ca funkcja zwrotnaW nast pnym wierszu naszego programu znajduje si wywoanie kolejnej funkcji biblioteki GLUT:glutDisplayFunc(RenderScene);

W tej linii ustalamy, e zdefiniowana wcze niej funkcja RenderScene b dzie funkcj zwrotn {callback function) wy wietlaj c obraz na ekranie. Oznacza to, e biblioteka GLUT b dzie wywoywa wskazan tu funkcj za ka dym razem, gdy okno b dzie wymagao przerysowywania. Takie wywoanie nast pi przy pierwszym wy wietleniu okna, a tak e przy zmianach jego rozmiaru albo odsoni ciu. W tym wa nie miejscu umieszczamy wywoania funkcji renderuj cych biblioteki OpenGL.

Ustalenie kontekstu i startW nast pnym wierszu znajduje si polecenie niezwi zane ani z bibliotek GLUT, ani z OpenGL, ale jest to rozwi zanie, ktrego b dziemy u ywa w caym tutorialu.SetupRC();

W tej funkcji wykonujemy wszystkie inicjalizacje biblioteki OpenGL, jakie musz by zako czone przed rozpocz ciem renderowania. Wiele ze stanw biblioteki OpenGL musi by ustalonych tylko raz i nie wymaga p niejszych modyfikacji przy renderowaniu ka dej ramki (przygotowywanej do wy wietlenia). Ostatnie wywoaniem funkcji biblioteki GLUT znajduje si na ko cu programu:glutMainLoop();

Ta funkcja uruchamia szkielet biblioteki GLUT. Po zdefiniowaniu funkcji zwrotnej obsuguj cej rysowanie na ekranie i innych funkcji (powiemy o nich w dalszej cz ci) uruchamiany jest mechanizm biblioteki. Powrt z funkcji glutMainLoop nast puje dopiero przy zako czeniu pracy programu, dlatego wystarczy wywoa j tylko raz. Funkcja ta przetwarza wszystkie komunikaty systemu operacyjnego, naci ni cia klawiszy i inne, do czasu zako czenia pracy 5

programu.

Wywoania graficzne OpenGLW funkcji SetupRC znajduje si wywoanie pojedynczej funkcji OpenGL:glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

funkcja ta ustala kolor stosowany do czyszczenia zawarto ci okna. Prototyp tej funkcji wygl da nast puj co:void glClearColor(GLclampf red. GLclampf green. GLclampf blue. GLclampf alpha);

W wi kszo ci implementacji biblioteki OpenGL typ GLclapf zdefiniowany jest jako float. W OpenGL pojedynczy kolor reprezentowany jest jako mieszanka skadowych, czerwonej, zielonej i niebieskiej. Warto ka dej z nich musi mie ci si w zakresie od 0.0 do 1.0. Jest to metoda podobna do specyfikacji stosowanej w systemie Windows, wedug ktrej kolory tworzone s za pomoc makra RGB daj cego w wyniku warto COLORREF. R nica polega na tym, e w systemie Windows ka da skadowa koloru w strukturze COLORREF mo e przyjmowa warto ci od 0 do 255, co w wyniku daje 256x256x256, czyli ponad 16 milionw kolorw. W bibliotece OpenGL warto ka dej skadowej koloru mo e przyjmowa dowoln warto zmiennoprzecinkow z zakresu od 0 do i. co oznacza, e teoretycznie mo na zdefiniowa niesko czon liczb kolorw. W praktyce mo liwo ci odtwarzania kolorw w wi kszo ci urz dze ograniczone s do 24 bitw, czyli 16 milionw kolorw. Oczywi cie, zarwno system Windows, jak i biblioteka OpenGL pobieraj warto koloru i przeksztacaj wewn trznie do najbli szego koloru mo liwego do uzyskania na dost pnym sprz cie wideo. j

W tabeli 2.2 wypisali my kilka typowych kolorw i warto ci ich skadowych. Mo na z nich korzysta w ka dej funkcji OpenGL zwi zanej z obsug kolorw.

Ostatni parametr funkcji glClearColor to skadowa alfa, ktra jest stosowana do mieszania kolorw oraz specjalnych efektw w rodzaju przezroczysto ci. Przezroczysto obiektu jest wasno ci pozwalaj c na przenikanie wiata przez obiekt. Przypu my, e chcieliby my przygotowa kawaek szka zabarwionego na czerwono, za ktrym umieszczone zostaoby niebieskie rdo wiata. Niebieskie wiato wpyn oby na wygl d czerwonej barwy szka mieszanka kolorw niebieskiego i czerwonego daje w efekcie kolor purpurowy. Warto skadowej alfa mo na zastosowa do uzyskania pprze roczystego koloru czerwonego, ktry wygl daby jak talia szka, zza ktrej widoczne byyby inne obiekty. Taki efekt wi e si nie tylko z wykorzystaniem skadowej alfa, ale na razie warto skadowej alfa b dziemy ustala na 1.

6

Czyszczenie bufora kolorwDo tej pory nakazali my bibliotece OpenGL u ywa koloru niebieskiego jako koloru czyszcz cego. W funkcji RenderScene musimy teraz wykona wa ciw operacj czyszczenia:glClear(GL_COLOR_BUFFER_BIT);

Funkcja glClear czy ci zawarto okre lonego bufora lub kombinacji buforw. Bufor jest obszarem w pami ci przechowuj cym informacj o obrazie. Skadowe czerwona, zielona i niebieska, tworz ce rysunek, zazwyczaj opisywane s terminem bufora koloru (ang. color buffer) lub bufora pikseli (ang. pixel buffer). W bibliotece OpenGL dost pnych jest kilka rodzajw buforw (koloru, g bi, szablonowy i akumulacji). Na razie wystarczy pami ta , e bufor koloru jest miejscem, w ktrym wewn trznie zapisywany jest wy wietlany obraz, a czyszczenie tego bufora poleceniem glClear powoduje usuni cie z okna ostatniego obrazu.

Czyszczenie kolejkiW ko cu pojawia si ostatnie polecenie OpenGL:glFlush();

Powoduje ono, e wszystkie niewykonane go tej pory polecenia OpenGL zostan wykonane. Jak na razie mamy tylko jedno takie polecenie glClear. Biblioteka OpenGL wewn trznie korzysta z potoku renderuj cego sekwencyjnie przetwarzaj cego polecenia. Polecenia i instrukcje OpenGL najcz ciej umieszczane s w kolejce do czasu, a sterownik OpenGL b dzie mg przetworzy kilka polece naraz. Takie dziaanie podnosi wydajno , poniewa komunikacja ze sprz tem jest z natury powolna. Jednokrotne przesianie do karty graficznej wi kszej ilo ci danych jest znacznie szybsze ni wykonywanie kilku przesyw, po jednym dla ka dego polecenia lub instrukcji. W krtkim programie przedstawionym w powy szym listingu, funkcja glFlush nakazuje bibliotece rozpocz cie przetwarzania dostarczonej do tej pory instrukcji, bez czekania na pojawianie si kolejnych polece rysowania. Program SIMPLE z ca pewno ci nie nale y do najciekawszych programw u ywaj cych biblioteki OpenGL, ale dobrze obrazuje podstawy korzystania z okna za pomoc biblioteki GLUT, a tak e przedstawia sposb okre lania koloru i czyszczenia zawarto ci okna. Teraz nieco rozbudujemy nasz program, dodaj c do niego kolejne funkcje z bibliotek GLUT i OpenGL.

Rysowanie ksztatw w OpenGLProgram SIMPLE tworzy puste okno z niebieskim tem. Sprbujmy teraz co w tym oknie narysowa . Dodatkowo sprbujemy uzyska mo liwo zmiany poo enia i rozmiaru okna, tak eby kod renderuj cy odpowiednio reagowa na te zmiany. Na poni szym listingu podano wszystkie potrzebne modyfikacje programu.#include /////////////////////////////////////////////////////////// // Wywoywana w celu przerysowania sceny void RenderScene(void) { // Wyczyszczenie okna aktualnym kolorem czyszcz cym glClear(GL_COLOR_BUFFER_BIT); // Aktualny kolor rysuj cy - czerwony // R G B glColor3f(1.0f, 0.0f, 0.0f); // Narysowanie prostok ta wypenionego aktualnym kolorem glRectf(-25.0f, 25.0f, 25.0f, -25.0f); // Wysanie polece do wykonania glFlush(); }

7

/////////////////////////////////////////////////////////// // Konfiguracja stanu renderowania void SetupRC(void) { // Ustalenie niebieskiego koloru czyszcz cego glClearColor(0.0f, 0.0f, 1.0f, 1.0f); } /////////////////////////////////////////////////////////// // Wywoywana przez bibliotek GLUT w przypadku zmiany rozmiaru okna void ChangeSize(int w, int h) { GLfloat aspectRatio; // Zabezpieczenie przed dzieleniem przez zero if(h == 0) h = 1; // Ustawienie wielko ci widoku na rwn wielko ci okna glViewport(0, 0, w, h); // Ustalenie ukadu wsprz dnych glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Wyznaczenie przestrzeni ograniczaj cej (lewy, prawy, dolny, grny, bliski, odlegy) aspectRatio = (GLfloat)w / (GLfloat)h; if (w