Strona główna
Kursy
Artykuły
Forum
Pliki
Promuj Nas!
[Kurs OpenGL, C++] II. Pierwszy program
http://kursy.ddt.pl/?LessonId=176
1 z 4
2010-04-30 14:21
Powrót
Historia odwiedzonych stron
Poprzednia lekcja
Kurs OpenGL, C++
Następna lekcja
Autor: Janusz Ganczarski
http://januszg.hg.pl/opengl/
II. Pierwszy program
Pierwszy program korzystajacy z biblioteki OpenGL jest oczywiscie bardzo prosty. Wyswietlimy w oknie o
rozmiarach 400 × 400 pikseli kwadrat o bokach jednostkowych. Program składa sie z trzech zasadniczych
elementów. Pierwszy to funkcja rysujaca scene 3D, drugim jest inicjacja okna renderingu a trzecim obsługa menu
podrecznego.
Poniższy rysunek przedstawia program, jaki zostanie napisany w oparciu o wiedzę zdobytą w niniejszym
rozdziale.
Rysunek 1. Okno początkowe programu K wadrat 1
2.1. Rysowanie sceny 3D
Rysowanie, czy tez jak przyjeło sie to nazywac, renderowanie sceny 3D, składa sie z kilku kroków. Z uwagi
na prostote programu etapy występujące w pierwszym programie nie przedstawiaja kompletnego schematu
tworzenia sceny 3D.
2.1.1. Kolor tła
Pierwszym etapem tworzenia sceny 3D, który realizuje funkcja Display, jest okreslenie koloru tła, czyli
wartosci jakimi zostanie wypełniony bufor koloru. Realizuje to funkcja:
void
glClearColor (GLclampf red, GLclampf green, GLclampf blue,GLclampf
alpha)
której parametry red, green, blue okreslaja wartosci składowych koloru, a parametr alpha wartosc
składowej kanału alfa (stopien przezroczystosci piksela). Wartosci wszystkich parametrów funkcji glClearColor
powinny zawierac sie w przedziale [0, 1]. Parametry przekraczajace powyzszy zakres zostana odpowiednio
przyciete: mniejsze od 0 przyjma wartosc 0, wieksze od 1 wartosc 1. Domyslne podczas czyszczenia bufora
koloru uzywa sie koloru (0, 0, 0, 0).
2.1.2. Czyszczenie bufora koloru
Po okresleniu koloru tła przystepujemy do wyczyszczenia tła, czyli wypełnienia zawartosci bufora koloru.
Wykonuje to funkcja:
void
glClear (GLbitfield mask)
której na razie jedynym parametrem jest stała GL COLOR BUFFER BIT okreslajaca jaki element bufora
ramki ma zostac wypełniony.
2.1.3. Kolor obiektu
Kolejnym etapem tworzenia naszej sceny 3D jest okreslenie koloru obiektu. Wykorzystamy do tego celu
jedna z funkcji z rodziny glColor:
void
glColor3f (GLfloat red, GLfloat green, GLfloat blue)
której parametry red, green, blue okreslaja wartosci składowych koloru. Zakres tych wartosci powinny
zawierac sie w przedziale [0, 1]. Wartosci znajdujące sie poza tym przedziałem zostana odpowiednio przyciete.
Uwazny Czytelnik zapyta zapewne dlaczego dla koloru obiektu nie określamy wartosci składowej alfa. Jest
to oczywiscie mozliwe - rodzina funkcji glColor zawiera takze funkcje okreslajace kolor na podstawie czterech
składowych. Jezeli jednak zdecydujemy sie na okreslanie tylko składowych RGB, składowa alfa przyjmuje
domyslna wartosc 1,0 (całkowita nieprzezroczystosc).
2.1.4. Definiowanie obiektu
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 OpenGL, C++] II. Pierwszy program
http://kursy.ddt.pl/?LessonId=176
2 z 4
2010-04-30 14:21
Definiowanie obiektów w OpenGL rozpoczyna wywołanie funkcji:
void
glBegin (GLenum mode)
która okresla rodzaj generowanego prymitywu lub prymitywów. W pierwszym programie traktujemy
kwadrat jako szczególny przypadek wielokata, stad stała GL POLYGON. Kolejne wierzchołki kwadratu
okreslamy przy pomocy funkcji:
void
glVertex3f (GLfloat x, GLfloat y, GLfloat z)
która nalezy do rodziny obszernej funkcji glVertex. Jezeli uwaznie popatrzymy na współrzedne
wierzchołków rysowanego kwadratu, to zauwazymy, ze zawiera sie on w płaszczyznie o równaniu Z = 0. W takim
przypadku do definiowania współrzednych wierzchołków obiektów mozna takze zastosowac funkcje glVertex2,
która pozwala okreslic dwie pierwsze współrzędne wierzchołków, trzeciej nadajac wartosc 0.
Definiowane współrzednych wierzchołków obiektu obowiazkowo konczy wywołanie funkcji:
void
glEnd (
void
)
Specyfikacja biblioteki nie pozwala na uruchamianie wszystkich polecen OpenGL pomiedzy para wywołan
funkcji glBegin i glEnd. Co do zasady moga sie tam znalezc polecenia generujace obiekty sceny. Wywołanie
niedozwolonej funkcji powoduje zgłoszenie błedu, ale nie przerywa działania programu.
2.1.5. Wykonanie polecen OpenGL i zamiana buforów koloru
To w jaki sposób biblioteka utworzy scene 3D, po wywołaniu wszystkich funkcji tworzacych jej elementy,
zalezy oczywiscie od konkretnej implementacji. Jednak wywołujac funkcje:
void
glFlush (
void
)
mozemy wymusic wykonanie wszystkich dotychczasowych polecen. Ma to szczególne znaczenie, gdy dana
implementacja stosuje bufory polecen, a zalezy nam na wykonaniu czesci zadan. Koncowym elementem
tworzenia sceny 3D jest zamiana buforów koloru, co w przypadku stosowania biblioteki GLUT realizuje funkcja:
void
glutSwapBuffers (
void
)
2.2. Tworzenie okna renderingu
Okno renderingu tworzone jest funkcji main programu. Inicjalizacje bufora ramki wykonuje funkcja:
void
glutInitDisplayMode (
unsigned
int
mode)
W przykładowym programie wartosc parametru mode decyduje, ze bufor ramki zawiera dwa bufory koloru
(stała GLUT DOUBLE), które pracuja w trybie RGB (stała GLUT RGB).
Rozmiar okna renderingu, w którym bedzie rysowana scena 3D okresla funkcja:
void
glutInitWindowSize (
int
width,
int
height)
której parametry width i height oznaczaja odpowiednio szerokosc i wysokość obszaru dostepnego do
renderingu. Warto zauwazyc, ze wielkosc okna jakie zostanie utworzone po wywołaniu funkcji:
int
glutCreateWindow (
char
*name)
jest zalezna od systemu operacyjnego i jest tak dobrane aby obszar dostępny do renderingu miał wczesniej
okreslone rozmiary. W przykładowym programie obszar renderingu jest stały - zmiana rozmiaru okna (funkcja
Reshape) nie modyfikuje jego rozmiarów. Zmiana rozmiaru okna nie powoduje zmiany wielkosci ani
przemieszczenia rysowanego kwadratu.
Ostatnim etapem tworzenia okna renderingu jest dołaczenie funkcji generującej scene 3D (Display) oraz
funkcji wywoływanej przy zmianie rozmiarów okna (Reshape). Realizuja to funkcje:
void
glutDisplayFunc (
void
(*func)(
void
));
void
glutReshapeFunc (
void
(*func)(
int
width,
int
height));
2.3. Obsługa menu podręcznego
Menu podreczne tworzy funkcja:
int
glutCreateMenu (
void
(*func)(
int
value))
której parametrem jest wskaznik do funkcji obsługi komunikatów menu (w programie funkcja Menu) a
zwracana wartosc to unikatowy numer menu.
Dodanie kolejnych pozycji do menu podrecznego umozliwia funkcja:
void
glutAddMenuEntry (
char
*name,
int
value)
której parametry to nazwa pozycji menu i numer (unikatowy) przekazywany w przypadku wybrania tej
pozycji do funkcji obsługujacej komunikaty menu. W tym i dalszych programach unikatowosc numerów menu
zapewnia zastosowanie typu wyliczeniowego. W pierwszym programie menu ma minimalna zawartosc -
umozliwia jedynie wyjscie z programu. Z uwagi na róznice w kodowaniu polskich znaków w róznych systemach
operacyjnych wywołanie tej funkcji ujete zostało w bloku instrukcji warunkowych preprocesora:
#ifdef WIN32
#else
#endif
Ostatnia operacja przy tworzeniu menu podrecznego jest wywołanie funkcji okreslajacej, który przycisk
myszki aktywuje menu:
void
glutAttachMenu (
int
button)
Mozliwe sa nastepujace wartosci parametru button:
GLUT LEFT BUTTON - lewy przycisk myszki,
GLUT MIDDLE BUTTON - srodkowy przycisk myszki,
GLUT RIGHT BUTTON - prawy przycisk myszki.
[Kurs OpenGL, C++] II. Pierwszy program
http://kursy.ddt.pl/?LessonId=176
3 z 4
2010-04-30 14:21
2.4. Plik kwadrat1.cpp
Rysunek 1. Okno początkowe programu K wadrat 1
Początkowe okno programu kwadrat1.cpp, którego tekst zródłowy znajduje sie ponizej, przedstawia rysunek
1.
/*
(c) Janusz Ganczarski (Power)
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/
#include <GL/glut.h>
#include <stdlib.h>
// funkcja generująca scenę 3D
void
Display ()
{
// kolor tła - zawartość bufora koloru
glClearColor (1.0,1.0,1.0,1.0);
// czyszczenie bufora koloru
glClear (GL_COLOR_BUFFER_BIT);
// kolor kwadratu
glColor3f (1.0,0.0,0.0);
// początek definicji wielokąta
glBegin (GL_POLYGON);
2.5. Ź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
Poprzednia lekcja
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.357s
Autor: Piotr Szawdyński
[Kurs OpenGL, C++] II. Pierwszy program
http://kursy.ddt.pl/?LessonId=176
4 z 4
2010-04-30 14:21