Janusz Ganczarski
OpenGL
Bufor głębokości
Spis treści
Spis treści . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1. Bufor głębokości . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
Działanie bufora głębokości . . . . . . . . . . . . . . . . . . . . . . .
1
. . . . . . . . . . . . . . . . . . . . . .
1
Test bufora głębokości . . . . . . . . . . . . . . . . . . . . . . . . . .
2
. . . . . . . . . . . . . . . . . . . . .
2
Zakres wartości bufora głębokości . . . . . . . . . . . . . . .
3
Przesunięcie wartości głębi . . . . . . . . . . . . . . . . . . . . . . .
3
. . . . . . . . . . . . . . . . . . . . . . . . .
4
Plik colors.h . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Plik szescian5.cpp . . . . . . . . . . . . . . . . . . . . . . . .
16
. . . . . . . . . . . . . . . . . . . . . . . . .
24
Plik linie z halo.cpp . . . . . . . . . . . . . . . . . . . . . . .
29
Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
1. Bufor głębokości
Bufor głębokości to obok bufora koloru podstawowy element bufora ram-
ki czyli pamięci obrazu. Bufor głębokości, nazywany także z-buforem lub
buforem głębi, uczestniczy w procesie usuwania niewidocznych elementów
renderowanej sceny.
1.1. Działanie bufora głębokości
Działanie bufora głębokości polega w uproszczeniu na przechowywaniu
wartości współrzędnej z (głębokości) dla każdego piksela obrazu. Przy ryso-
waniu kolejnych pikseli danego obiektu obliczana jest wartość współrzędnej
z i porównywana z wartością znajdującą się w buforze. Jeżeli porównanie
wskazuje, że rysowany piksel „przesłania” to, co zostało narysowane wcze-
śniej, zmieniana jest zarówno zawartość bufora głębokości jak i bufora kolo-
ru.
Algorytm z-bufora nie jest oczywiście jedynym znanym algorytmem ukry-
wania niewidocznych obiektów. O jego zastosowaniu w bibliotece OpenGL
(i wielu innych bibliotekach grafiki 3D) zdecydowała łatwość sprzętowej im-
plementacji oraz stosunkowo wysoka efektywność. Trzeba w tym miejscu
dodać, że zaawansowane aplikacje stosujące bibliotekę OpenGL (czyli głów-
nie gry) stosują szereg dodatkowych technik eliminujących niewidoczne po-
wierzchnie obiektów przed etapem rysowana sceny. Pozwala to na czasami
znaczącą redukcję ilości operacji na buforze głębokości.
1.2. Włączenie bufora głębokości
Standardowo bufor głębokości nie jest używany przez bibliotekę OpenGL.
W pierwszej kolejności trzeba bufor dodać do bufora ramki. Jeżeli korzysta-
my z biblioteki GLUT, wymaga to dodania stałej GLUT DEPTH przy wywo-
łaniu funkcji glutInitDisplayMode na początku działania programu.
Standardowo OpenGL nie wykonuje operacji na buforze głębokości. Włą-
czenie testów bufora głębokości wymaga wywołania funkcji glEnable z pa-
rametrem GL DEPTH TEST. Biblioteka OpenGL umożliwia także wyłączenie
zapisu wartości współrzędnych z do bufora głębokości. Realizuje to funkcja:
void glDepthMask (GLboolean flag)
której parametr flag przyjmuje dwie wartości: GL FALSE - wyłączenie zapisu
do bufora głębokości i GL TRUE - włączenie zapisu do bufora głębokości.
1. Bufor głębokości
2
1.3. Test bufora głębokości
Biblioteka OpenGL umożliwia wybór rodzaju testu wykonywanego przy
użyciu danych zawartych w buforze głębokości. Wybór rodzaju testu umoż-
liwia funkcja:
void glDepthFunc (GLenum func)
Parametr func przyjmuje jedną z poniższych wartości:
— GL NEVER - wartość testu zawsze negatywna,
— GL LESS - wartość testu pozytywna jeżeli testowana wartość współrzędnej
z jest mniejsza od wartości znajdującej się w buforze; wartość domyślna,
— GL EQUAL - wartość testu pozytywna jeżeli testowana wartość współrzęd-
nej z jest równa wartości znajdującej się w buforze,
— GL LEQUAL - wartość testu pozytywna jeżeli testowana wartość współ-
rzędnej z jest mniejsza lub równa wartości znajdującej się w buforze,
— GL GREATER - wartość testu pozytywna jeżeli testowana wartość współ-
rzędnej z jest większa od wartości znajdującej się w buforze,
— GL NOTEQUAL - wartość testu pozytywna jeżeli testowana wartość współ-
rzędnej z jest różna od wartości znajdującej się w buforze,
— GL GEQUAL - wartość testu pozytywna jeżeli testowana wartość współ-
rzędnej z jest większa lub równa wartości znajdującej się w buforze,
— GL ALWAYS - wartość testu zawsze pozytywna.
Przy wyborze rodzaju testu z-bufora trzeba uwzględnić, jaki model współ-
rzędnych stosuje biblioteka OpenGL i jaką orientacje posiada oś OZ. W ty-
powym przypadku rodzaj testu inny niż GL LESS spowoduje niepoprawne
wyświetlenie elementów sceny 3D.
1.4. Czyszczenie bufora głębokości
Przez rozpoczęciem rysowania elementów sceny 3D konieczne jest wy-
czyszczenie zawartości bufora głębokości. Wymaga to dodania stałej
GL DEPTH BUFFER BIT przy wywołaniu funkcji glClear.
Standardowo bufor głębokości zawiera liczby z przedziału [0, 1] i jest
czyszczony liczbą 1. Biblioteka OpenGL daje możliwość wyboru wartości,
którą czyszczony jest bufor głębokości. Wymaga to wywołania funkcji:
void glClearDepth (GLclampd depth)
której parametr depth jest liczbą z przedziału [0, 1] (wartości przekraczające
ten przedział są odpowiednio przycinane).
1. Bufor głębokości
3
1.4.1. Zakres wartości bufora głębokości
Jak wcześniej powiedzieliśmy bufor głębokości zawiera standardowo licz-
by z przedziału [0, 1]. Biblioteka OpenGL umożliwia zmianę tego przedziału
poprzez użycie funkcji:
void glDepthRange (GLclampd zNear, GLclampd zFar)
Parametr zNear określą minimalna wartość w buforze głębokości, a zFar
maksymalną wartość w buforze głębokości. Wartości domyślne wynoszą oczy-
wiście 0 i 1. Oba parametry powinny należeć do przedziału [0, 1] (w razie
potrzeby OpenGL wykona odpowiednie przycięcie). Nie ma wymogu aby
wartość parametru zNear była mniejsza od wartości parametru zFar.
Warto pamiętać, że ograniczenie zakresu wartości przechowywanych w bu-
forze głębokości prowadzi do zmniejszenia jego dokładności i może spowo-
dować błędy przy usuwaniu niewidocznych obiektów.
1.5. Przesunięcie wartości głębi
W wersji 1.1 biblioteki OpenGL, a wcześniej w rozszerzeniu EXT poly-
gon offset, wprowadzono mechanizm pozwalający na przesuwanie wartości
głębi pikseli przy rysowaniu wielokątów. Przesunięcie wyliczane jest na pod-
stawie wzoru:
(m · f actor) + (r · units)
którego współczynnik m oznacza maksymalne nachylenie głębokości wieloką-
ta (obliczenia wykonuje OpenGL), a współczynnik r jest zależną od imple-
mentacji najmniejszą różnicą wartości przechowywanych w buforze głęboko-
ści. Określenie wartości współczynników skalowania factor i units wymaga
wywołania funkcji:
void glPolygonOffset (GLfloat factor, GLfloat units)
Wartości początkowe obu współczynników wynoszą 0.
Przesuwanie wartości głębi jest domyślnie wyłączone. Włączenie tego
mechanizmu wymaga wywołania funkcji glEnable z jednym z poniższych
parametrów:
— GL POLYGON OFFSET POINT - przesuwanie wartości głębi, gdy rysowane
są tylko wierzchołki wielokątów,
— GL POLYGON OFFSET LINE - przesuwanie wartości głębi, gdy rysowane są
tylko krawędzie wielokątów,
— GL POLYGON OFFSET FILL - przesuwanie wartości głębi, gdy rysowane są
wypełnione wielokąty.
1. Bufor głębokości
4
1.6. Programy przykładowe
Pierwszy program przykładowy (plik szescian5.cpp) prezentuje pod-
stawowe zadanie bufora głębokości, czyli ukrywanie niewidocznych krawędzi
obiektu 3D. Tym obiektem jest już po raz kolejny sześcian, ale tym ra-
zem o zupełnie innym wyglądzie - jest to bowiem sześcian przedstawiający
wszystkie barwy RGB (patrz rysunek 1). Efekt równomiernego rozłożenia
barw na bokach sześcianu zapewnia gładkie cieniowanie połączone z okre-
śleniem odpowiedniego koloru odrębnie dla każdego wierzchołka.
Na potrzeby tego i przyszłych programów przygotowany został plik
colors.h, który zawiera definicje składowych RGBA 141 kolorów. Definicje
oraz nazwy kolorów pochodzą z pakietu ASP.NET. Część angielskich nazw
kolorów została przetłumaczona — nazwy te umieszczono w komentarzach.
Rysunek 1. Program Sześcian 5
Poza rysowaniem sześcianu barw RGB program umożliwia wybór ro-
1. Bufor głębokości
5
dzaju testu bufora głębokości. Część z testów generuje pusty ekran, a te-
sty GL ALWAYS i GL NOTEQUAL dają całkowicie błędny wygląd obiektu (patrz
rysunek 2). Obracając sześcian (prawy przycisk myszki lub klawisze kurso-
ra) można zauważyć, kiedy następuje błędne rysowanie kolejnych trójkątów,
z których składają się ściany obiektu.
Rysunek 2. Program Sześcian 5 - testy GL ALWAYS i GL NOTEQUAL
1.6.1. Plik colors.h
/∗
( c )
J a n u s z
G a n c z a r s k i
h t t p : / / www . j a n u s z g . h g . p l
J a n u s z G @ e n t e r . n e t . p l
∗/
#i f n d e f
COLORS
H
#d e f i n e
COLORS
H
#i n c l u d e <GL/ g l . h>
//
d e f i n i c j e
k o l o r ó w RGB w ASP . NET ( S y s t e m . D r a w i n g . C o l o r )
//
ź r ó d ł o :
1. Bufor głębokości
6
//
h t t p : / / www . o p i n i o n a t e d g e e k . com / D o t N e t / T o o l s / C o l o r s / d e f a u l t . a s p x
const
G L f l o a t
A l i c e B l u e
[ 4 ] =
{
0 . 9 4 1 1 7 6 ,
0 . 9 7 2 5 4 9 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
A n t i q u e W h i t e
[ 4 ] =
{
0 . 9 8 0 3 9 2 ,
0 . 9 2 1 5 6 9 ,
0 . 8 4 3 1 3 7 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t Aqua
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
Aquamarine
[ 4 ] =
{
0 . 4 9 8 0 3 9 ,
1 . 0 0 0 0 0 0 ,
0 . 8 3 1 3 7 3 ,
1 . 0 0 0 0 0 0
} ;
//
l a z u r o w y
const
G L f l o a t
Azure
[ 4 ] =
{
0 . 9 4 1 1 7 6 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
b e ż o w y
const
G L f l o a t
B e i g e
[ 4 ] =
{
0 . 9 6 0 7 8 4 ,
0 . 9 6 0 7 8 4 ,
0 . 8 6 2 7 4 5 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
B i s q u e
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 9 4 1 1 8 ,
0 . 7 6 8 6 2 7 ,
1 . 0 0 0 0 0 0
} ;
//
c z a r n y
const
G L f l o a t
B l a c k
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
BlanchedAlmond
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 2 1 5 6 9 ,
0 . 8 0 3 9 2 2 ,
1 . 0 0 0 0 0 0
} ;
//
n i e b i e s k i
const
G L f l o a t
B l u e
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
n i e b i e s k o f i l e t o w y
const
G L f l o a t
B l u e V i o l e t
[ 4 ] =
{
0 . 5 4 1 1 7 6 ,
0 . 1 6 8 6 2 7 ,
0 . 8 8 6 2 7 5 ,
1 . 0 0 0 0 0 0
} ;
//
b r ą z o w y
const
G L f l o a t Brown
[ 4 ] =
{
0 . 6 4 7 0 5 9 ,
0 . 1 6 4 7 0 6 ,
0 . 1 6 4 7 0 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
BurlyWood
[ 4 ] =
{
0 . 8 7 0 5 8 8 ,
0 . 7 2 1 5 6 9 ,
0 . 5 2 9 4 1 2 ,
1 . 0 0 0 0 0 0
} ;
1. Bufor głębokości
7
const
G L f l o a t
C a d e t B l u e
[ 4 ] =
{
0 . 3 7 2 5 4 9 ,
0 . 6 1 9 6 0 8 ,
0 . 6 2 7 4 5 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
C h a r t r e u s e
[ 4 ] =
{
0 . 4 9 8 0 3 9 ,
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
c z e k o l a d o w y
const
G L f l o a t
C h o c o l a t e
[ 4 ] =
{
0 . 8 2 3 5 2 9 ,
0 . 4 1 1 7 6 5 ,
0 . 1 1 7 6 4 7 ,
1 . 0 0 0 0 0 0
} ;
//
k o r a l o w y
const
G L f l o a t
C o r a l
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 4 9 8 0 3 9 ,
0 . 3 1 3 7 2 5 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
C o r n f l o w e r B l u e
[ 4 ] =
{
0 . 3 9 2 1 5 7 ,
0 . 5 8 4 3 1 4 ,
0 . 9 2 9 4 1 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
C o r n s i l k
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 7 2 5 4 9 ,
0 . 8 6 2 7 4 5 ,
1 . 0 0 0 0 0 0
} ;
//
k a r m a z y n o w y
( p u r p u r o w y )
const
G L f l o a t
Crimson
[ 4 ] =
{
0 . 8 6 2 7 4 5 ,
0 . 0 7 8 4 3 1 ,
0 . 2 3 5 2 9 4 ,
1 . 0 0 0 0 0 0
} ;
//
n i e b i e s k o z i e l o n y
const
G L f l o a t Cyan
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o n i e b i e s k i
const
G L f l o a t
DarkBlue
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
0 . 5 4 5 0 9 8 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o n i e b i e s k o z i e l o n y
const
G L f l o a t
DarkCyan
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 5 4 5 0 9 8 ,
0 . 5 4 5 0 9 8 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k G o l d e n r o d
[ 4 ] =
{
0 . 7 2 1 5 6 9 ,
0 . 5 2 5 4 9 0 ,
0 . 0 4 3 1 3 7 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o s z a r y
const
G L f l o a t
DarkGray
[ 4 ] =
{
0 . 6 6 2 7 4 5 ,
0 . 6 6 2 7 4 5 ,
0 . 6 6 2 7 4 5 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o z i e l o n y
const
G L f l o a t
DarkGreen
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 3 9 2 1 5 7 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
1. Bufor głębokości
8
//
c i e m n y
k h a k i
const
G L f l o a t
DarkKhaki
[ 4 ] =
{
0 . 7 4 1 1 7 6 ,
0 . 7 1 7 6 4 7 ,
0 . 4 1 9 6 0 8 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n y
p u r p u r o w y
const
G L f l o a t
DarkMagenta
[ 4 ] =
{
0 . 5 4 5 0 9 8 ,
0 . 0 0 0 0 0 0 ,
0 . 5 4 5 0 9 8 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k O l i v e G r e e n
[ 4 ] =
{
0 . 3 3 3 3 3 3 ,
0 . 4 1 9 6 0 8 ,
0 . 1 8 4 3 1 4 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o p o m a r a ń c z o w y
const
G L f l o a t
DarkOrange
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 5 4 9 0 2 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k O r c h i d
[ 4 ] =
{
0 . 6 0 0 0 0 0 ,
0 . 1 9 6 0 7 8 ,
0 . 8 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o c z e r w o n y
const
G L f l o a t
DarkRed
[ 4 ] =
{
0 . 5 4 5 0 9 8 ,
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
DarkSalmon
[ 4 ] =
{
0 . 9 1 3 7 2 5 ,
0 . 5 8 8 2 3 5 ,
0 . 4 7 8 4 3 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
DarkSeaGreen
[ 4 ] =
{
0 . 5 6 0 7 8 4 ,
0 . 7 3 7 2 5 5 ,
0 . 5 4 5 0 9 8 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k S l a t e B l u e
[ 4 ] =
{
0 . 2 8 2 3 5 3 ,
0 . 2 3 9 2 1 6 ,
0 . 5 4 5 0 9 8 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k S l a t e G r a y
[ 4 ] =
{
0 . 1 8 4 3 1 4 ,
0 . 3 0 9 8 0 4 ,
0 . 3 0 9 8 0 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D a r k T u r q u o i s e
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 8 0 7 8 4 3 ,
0 . 8 1 9 6 0 8 ,
1 . 0 0 0 0 0 0
} ;
//
c i e m n o f i o l e t o w y
const
G L f l o a t
D a r k V i o l e t
[ 4 ] =
{
0 . 5 8 0 3 9 2 ,
0 . 0 0 0 0 0 0 ,
0 . 8 2 7 4 5 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
DeepPink
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 0 7 8 4 3 1 ,
0 . 5 7 6 4 7 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
DeepSkyBlue
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 7 4 9 0 2 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
1. Bufor głębokości
9
const
G L f l o a t DimGray
[ 4 ] =
{
0 . 4 1 1 7 6 5 ,
0 . 4 1 1 7 6 5 ,
0 . 4 1 1 7 6 5 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
D o d g e r B l u e
[ 4 ] =
{
0 . 1 1 7 6 4 7 ,
0 . 5 6 4 7 0 6 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
F i r e b r i c k
[ 4 ] =
{
0 . 6 9 8 0 3 9 ,
0 . 1 3 3 3 3 3 ,
0 . 1 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
F l o r a l W h i t e
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 8 0 3 9 2 ,
0 . 9 4 1 1 7 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
F o r e s t G r e e n
[ 4 ] =
{
0 . 1 3 3 3 3 3 ,
0 . 5 4 5 0 9 8 ,
0 . 1 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
//
f u k s j a
const
G L f l o a t
F u c h s i a
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
G a i n s b o r o
[ 4 ] =
{
0 . 8 6 2 7 4 5 ,
0 . 8 6 2 7 4 5 ,
0 . 8 6 2 7 4 5 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
GhostWhite
[ 4 ] =
{
0 . 9 7 2 5 4 9 ,
0 . 9 7 2 5 4 9 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
z ł o t y
const
G L f l o a t
Gold
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 4 3 1 3 7 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
G o l d e n r o d
[ 4 ] =
{
0 . 8 5 4 9 0 2 ,
0 . 6 4 7 0 5 9 ,
0 . 1 2 5 4 9 0 ,
1 . 0 0 0 0 0 0
} ;
//
s z a r y
const
G L f l o a t
Gray
[ 4 ] =
{
0 . 5 0 1 9 6 1 ,
0 . 5 0 1 9 6 1 ,
0 . 5 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
z i e l o n y
const
G L f l o a t
Green
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 5 0 1 9 6 1 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
z i e l o n o ż ó ł t y
const
G L f l o a t
G r e e n Y e l l o w
[ 4 ] =
{
0 . 6 7 8 4 3 1 ,
1 . 0 0 0 0 0 0 ,
0 . 1 8 4 3 1 4 ,
1 . 0 0 0 0 0 0
} ;
//
s p a d z i o w y
const
G L f l o a t
Honeydew
[ 4 ] =
{
1. Bufor głębokości
10
0 . 9 4 1 1 7 6 ,
1 . 0 0 0 0 0 0 ,
0 . 9 4 1 1 7 6 ,
1 . 0 0 0 0 0 0
} ;
//
i n t e n s y w n y
r ó ż o w y
const
G L f l o a t
HotPink
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 4 1 1 7 6 5 ,
0 . 7 0 5 8 8 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
I n d i a n R e d
[ 4 ] =
{
0 . 8 0 3 9 2 2 ,
0 . 3 6 0 7 8 4 ,
0 . 3 6 0 7 8 4 ,
1 . 0 0 0 0 0 0
} ;
//
i n d y g o
const
G L f l o a t
I n d i g o
[ 4 ] =
{
0 . 2 9 4 1 1 8 ,
0 . 0 0 0 0 0 0 ,
0 . 5 0 9 8 0 4 ,
1 . 0 0 0 0 0 0
} ;
//
k o ś ć
s ł o n i o w a
const
G L f l o a t
I v o r y
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
0 . 9 4 1 1 7 6 ,
1 . 0 0 0 0 0 0
} ;
//
k h a k i
const
G L f l o a t
Khaki
[ 4 ] =
{
0 . 9 4 1 1 7 6 ,
0 . 9 0 1 9 6 1 ,
0 . 5 4 9 0 2 0 ,
1 . 0 0 0 0 0 0
} ;
//
l a w e n d o w y
const
G L f l o a t
L a v e n d e r
[ 4 ] =
{
0 . 9 0 1 9 6 1 ,
0 . 9 0 1 9 6 1 ,
0 . 9 8 0 3 9 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L a v e n d e r B l u s h
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 4 1 1 7 6 ,
0 . 9 6 0 7 8 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
LawnGreen
[ 4 ] =
{
0 . 4 8 6 2 7 5 ,
0 . 9 8 8 2 3 5 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L e m o n C h i f f o n
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 8 0 3 9 2 ,
0 . 8 0 3 9 2 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t B l u e
[ 4 ] =
{
0 . 6 7 8 4 3 1 ,
0 . 8 4 7 0 5 9 ,
0 . 9 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t C o r a l
[ 4 ] =
{
0 . 9 4 1 1 7 6 ,
0 . 5 0 1 9 6 1 ,
0 . 5 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t C y a n
[ 4 ] =
{
0 . 8 7 8 4 3 1 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t G o l d e n r o d Y e l l o w
[ 4 ] =
{
0 . 9 8 0 3 9 2 ,
0 . 9 8 0 3 9 2 ,
0 . 8 2 3 5 2 9 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t G r a y
[ 4 ] =
{
1. Bufor głębokości
11
0 . 8 2 7 4 5 1 ,
0 . 8 2 7 4 5 1 ,
0 . 8 2 7 4 5 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t G r e e n
[ 4 ] =
{
0 . 5 6 4 7 0 6 ,
0 . 9 3 3 3 3 3 ,
0 . 5 6 4 7 0 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t P i n k
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 7 1 3 7 2 5 ,
0 . 7 5 6 8 6 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t S a l m o n
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 6 2 7 4 5 1 ,
0 . 4 7 8 4 3 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t S e a G r e e n
[ 4 ] =
{
0 . 1 2 5 4 9 0 ,
0 . 6 9 8 0 3 9 ,
0 . 6 6 6 6 6 7 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t S k y B l u e
[ 4 ] =
{
0 . 5 2 9 4 1 2 ,
0 . 8 0 7 8 4 3 ,
0 . 9 8 0 3 9 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t S l a t e G r a y
[ 4 ] =
{
0 . 4 6 6 6 6 7 ,
0 . 5 3 3 3 3 3 ,
0 . 6 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t S t e e l B l u e
[ 4 ] =
{
0 . 6 9 0 1 9 6 ,
0 . 7 6 8 6 2 7 ,
0 . 8 7 0 5 8 8 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
L i g h t Y e l l o w
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
0 . 8 7 8 4 3 1 ,
1 . 0 0 0 0 0 0
} ;
//
c y t r y n o w y
const
G L f l o a t
Lime
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
c y t r y n o w o z i e l o n y
const
G L f l o a t
LimeGreen
[ 4 ] =
{
0 . 1 9 6 0 7 8 ,
0 . 8 0 3 9 2 2 ,
0 . 1 9 6 0 7 8 ,
1 . 0 0 0 0 0 0
} ;
//
l n i a n y
const
G L f l o a t
L i n e n
[ 4 ] =
{
0 . 9 8 0 3 9 2 ,
0 . 9 4 1 1 7 6 ,
0 . 9 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
p u r p u r o w y
const
G L f l o a t
Magenta
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
k a s z t a n o w y ,
b r ą z o w o c z e r w o n y
const
G L f l o a t
Maroon
[ 4 ] =
{
0 . 5 0 1 9 6 1 ,
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumAquamarine
[ 4 ] =
{
1. Bufor głębokości
12
0 . 4 0 0 0 0 0 ,
0 . 8 0 3 9 2 2 ,
0 . 6 6 6 6 6 7 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumBlue
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
0 . 8 0 3 9 2 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumOrchid
[ 4 ] =
{
0 . 7 2 9 4 1 2 ,
0 . 3 3 3 3 3 3 ,
0 . 8 2 7 4 5 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumPurple
[ 4 ] =
{
0 . 5 7 6 4 7 1 ,
0 . 4 3 9 2 1 6 ,
0 . 8 5 8 8 2 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumSeaGreen
[ 4 ] =
{
0 . 2 3 5 2 9 4 ,
0 . 7 0 1 9 6 1 ,
0 . 4 4 3 1 3 7 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
M e d i u m S l a t e B l u e
[ 4 ] =
{
0 . 4 8 2 3 5 3 ,
0 . 4 0 7 8 4 3 ,
0 . 9 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumSpringGreen
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 9 8 0 3 9 2 ,
0 . 6 0 3 9 2 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumTurquoise
[ 4 ] =
{
0 . 2 8 2 3 5 3 ,
0 . 8 1 9 6 0 8 ,
0 . 8 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MediumVioletRed
[ 4 ] =
{
0 . 7 8 0 3 9 2 ,
0 . 0 8 2 3 5 3 ,
0 . 5 2 1 5 6 9 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
M i d n i g h t B l u e
[ 4 ] =
{
0 . 0 9 8 0 3 9 ,
0 . 0 9 8 0 3 9 ,
0 . 4 3 9 2 1 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
MintCream
[ 4 ] =
{
0 . 9 6 0 7 8 4 ,
1 . 0 0 0 0 0 0 ,
0 . 9 8 0 3 9 2 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
M i s t y R o s e
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 9 4 1 1 8 ,
0 . 8 8 2 3 5 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
M o c c a s i n
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 9 4 1 1 8 ,
0 . 7 0 9 8 0 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
NavajoWhite
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 7 0 5 8 8 ,
0 . 6 7 8 4 3 1 ,
1 . 0 0 0 0 0 0
} ;
//
g r a n a t o w y
const
G L f l o a t Navy
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
0 . 5 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
O l d L a c e
[ 4 ] =
{
0 . 9 9 2 1 5 7 ,
0 . 9 6 0 7 8 4 ,
0 . 9 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
1. Bufor głębokości
13
//
o l i w k o w y
const
G L f l o a t
O l i v e
[ 4 ] =
{
0 . 5 0 1 9 6 1 ,
0 . 5 0 1 9 6 1 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
k h a k i ,
s z a r o z i e l o n y
const
G L f l o a t
O l i v e D r a b
[ 4 ] =
{
0 . 4 1 9 6 0 8 ,
0 . 5 5 6 8 6 3 ,
0 . 1 3 7 2 5 5 ,
1 . 0 0 0 0 0 0
} ;
//
o r a n ż ,
p o m a r a ń c z o w y
const
G L f l o a t
Orange
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 6 4 7 0 5 9 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
p o m a r a ń c z o w o c z e r w o n y
const
G L f l o a t
OrangeRed
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 2 7 0 5 8 8 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
O r c h i d
[ 4 ] =
{
0 . 8 5 4 9 0 2 ,
0 . 4 3 9 2 1 6 ,
0 . 8 3 9 2 1 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
P a l e G o l d e n r o d
[ 4 ] =
{
0 . 9 3 3 3 3 3 ,
0 . 9 0 9 8 0 4 ,
0 . 6 6 6 6 6 7 ,
1 . 0 0 0 0 0 0
} ;
//
b l a d o z i e l o n y
const
G L f l o a t
P a l e G r e e n
[ 4 ] =
{
0 . 5 9 6 0 7 8 ,
0 . 9 8 4 3 1 4 ,
0 . 5 9 6 0 7 8 ,
1 . 0 0 0 0 0 0
} ;
//
b l a d o t u r k u s o w y
const
G L f l o a t
P a l e T u r q u o i s e
[ 4 ] =
{
0 . 6 8 6 2 7 5 ,
0 . 9 3 3 3 3 3 ,
0 . 9 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
P a l e V i o l e t R e d
[ 4 ] =
{
0 . 8 5 8 8 2 4 ,
0 . 4 3 9 2 1 6 ,
0 . 5 7 6 4 7 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
PapayaWhip
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 3 7 2 5 5 ,
0 . 8 3 5 2 9 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
P e a c h P u f f
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 8 5 4 9 0 2 ,
0 . 7 2 5 4 9 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
Peru
[ 4 ] =
{
0 . 8 0 3 9 2 2 ,
0 . 5 2 1 5 6 9 ,
0 . 2 4 7 0 5 9 ,
1 . 0 0 0 0 0 0
} ;
//
r ó ż o w y
const
G L f l o a t
P i nk
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 7 5 2 9 4 1 ,
0 . 7 9 6 0 7 8 ,
1 . 0 0 0 0 0 0
} ;
1. Bufor głębokości
14
//
ś l i w k o w y
const
G L f l o a t Plum
[ 4 ] =
{
0 . 8 6 6 6 6 7 ,
0 . 6 2 7 4 5 1 ,
0 . 8 6 6 6 6 7 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
PowderBlue
[ 4 ] =
{
0 . 6 9 0 1 9 6 ,
0 . 8 7 8 4 3 1 ,
0 . 9 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
p u r p u r o w y
const
G L f l o a t
P u r p l e
[ 4 ] =
{
0 . 5 0 1 9 6 1 ,
0 . 0 0 0 0 0 0 ,
0 . 5 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
c z e r w o n y
const
G L f l o a t Red
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
RosyBrown
[ 4 ] =
{
0 . 7 3 7 2 5 5 ,
0 . 5 6 0 7 8 4 ,
0 . 5 6 0 7 8 4 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
R o y a l B l u e
[ 4 ] =
{
0 . 2 5 4 9 0 2 ,
0 . 4 1 1 7 6 5 ,
0 . 8 8 2 3 5 3 ,
1 . 0 0 0 0 0 0
} ;
//
b r u n a t n y
const
G L f l o a t
SaddleBrown
[ 4 ] =
{
0 . 5 4 5 0 9 8 ,
0 . 2 7 0 5 8 8 ,
0 . 0 7 4 5 1 0 ,
1 . 0 0 0 0 0 0
} ;
//
ł o s o s i o w y
const
G L f l o a t
Salmon
[ 4 ] =
{
0 . 9 8 0 3 9 2 ,
0 . 5 0 1 9 6 1 ,
0 . 4 4 7 0 5 9 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
SandyBrown
[ 4 ] =
{
0 . 9 5 6 8 6 3 ,
0 . 6 4 3 1 3 7 ,
0 . 3 7 6 4 7 1 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
S e a G r e e n
[ 4 ] =
{
0 . 1 8 0 3 9 2 ,
0 . 5 4 5 0 9 8 ,
0 . 3 4 1 1 7 6 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
S e a S h e l l
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 6 0 7 8 4 ,
0 . 9 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
//
s j e n a
const
G L f l o a t
S i e n n a
[ 4 ] =
{
0 . 6 2 7 4 5 1 ,
0 . 3 2 1 5 6 9 ,
0 . 1 7 6 4 7 1 ,
1 . 0 0 0 0 0 0
} ;
//
s r e b r n y
const
G L f l o a t
S i l v e r
[ 4 ] =
{
0 . 7 5 2 9 4 1 ,
0 . 7 5 2 9 4 1 ,
0 . 7 5 2 9 4 1 ,
1 . 0 0 0 0 0 0
} ;
//
b ł ę k i t n y ,
j a s n o n i e b i e s k i ,
l a z u r o w y
1. Bufor głębokości
15
const
G L f l o a t
S k y B l u e
[ 4 ] =
{
0 . 5 2 9 4 1 2 ,
0 . 8 0 7 8 4 3 ,
0 . 9 2 1 5 6 9 ,
1 . 0 0 0 0 0 0
} ;
//
ł u p k o w o n i e b i e s k i
const
G L f l o a t
S l a t e B l u e
[ 4 ] =
{
0 . 4 1 5 6 8 6 ,
0 . 3 5 2 9 4 1 ,
0 . 8 0 3 9 2 2 ,
1 . 0 0 0 0 0 0
} ;
//
ł u p k o w o s z a r y
const
G L f l o a t
S l a t e G r a y
[ 4 ] =
{
0 . 4 3 9 2 1 6 ,
0 . 5 0 1 9 6 1 ,
0 . 5 6 4 7 0 6 ,
1 . 0 0 0 0 0 0
} ;
//
ś n i e ż n y
const
G L f l o a t Snow
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 9 8 0 3 9 2 ,
0 . 9 8 0 3 9 2 ,
1 . 0 0 0 0 0 0
} ;
//
z i e l o n y
w i o s e n n y
const
G L f l o a t
S p r i n g G r e e n
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
0 . 4 9 8 0 3 9 ,
1 . 0 0 0 0 0 0
} ;
//
s t a l o w o n i e b i e s k i ,
s z a r o n i e b i e s k i
const
G L f l o a t
S t e e l B l u e
[ 4 ] =
{
0 . 2 7 4 5 1 0 ,
0 . 5 0 9 8 0 4 ,
0 . 7 0 5 8 8 2 ,
1 . 0 0 0 0 0 0
} ;
//
j a s n o b r ą z o w y
const
G L f l o a t Tan
[ 4 ] =
{
0 . 8 2 3 5 2 9 ,
0 . 7 0 5 8 8 2 ,
0 . 5 4 9 0 2 0 ,
1 . 0 0 0 0 0 0
} ;
//
c y r a n k o w y
const
G L f l o a t
T e a l
[ 4 ] =
{
0 . 0 0 0 0 0 0 ,
0 . 5 0 1 9 6 1 ,
0 . 5 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
o s t o w y
const
G L f l o a t
T h i s t l e
[ 4 ] =
{
0 . 8 4 7 0 5 9 ,
0 . 7 4 9 0 2 0 ,
0 . 8 4 7 0 5 9 ,
1 . 0 0 0 0 0 0
} ;
//
p o m i d o r o w y
const
G L f l o a t
Tomato
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
0 . 3 8 8 2 3 5 ,
0 . 2 7 8 4 3 1 ,
1 . 0 0 0 0 0 0
} ;
//
p r z e z r o c z y s t y
const
G L f l o a t
T r a n s p a r e n t
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
t u r k u s o w y
const
G L f l o a t
T u r q u o i s e
[ 4 ] =
{
1. Bufor głębokości
16
0 . 2 5 0 9 8 0 ,
0 . 8 7 8 4 3 1 ,
0 . 8 1 5 6 8 6 ,
1 . 0 0 0 0 0 0
} ;
//
f i o l e t o w y
const
G L f l o a t
V i o l e t
[ 4 ] =
{
0 . 9 3 3 3 3 3 ,
0 . 5 0 9 8 0 4 ,
0 . 9 3 3 3 3 3 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t Wheat
[ 4 ] =
{
0 . 9 6 0 7 8 4 ,
0 . 8 7 0 5 8 8 ,
0 . 7 0 1 9 6 1 ,
1 . 0 0 0 0 0 0
} ;
//
b i a ł y
const
G L f l o a t
White
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
const
G L f l o a t
WhiteSmoke
[ 4 ] =
{
0 . 9 6 0 7 8 4 ,
0 . 9 6 0 7 8 4 ,
0 . 9 6 0 7 8 4 ,
1 . 0 0 0 0 0 0
} ;
//
ź ó ł t y
const
G L f l o a t
Y e l l o w
[ 4 ] =
{
1 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0 ,
0 . 0 0 0 0 0 0 ,
1 . 0 0 0 0 0 0
} ;
//
ż ó ł t o z i e l o n y
const
G L f l o a t
Y e l l o w G r e e n
[ 4 ] =
{
0 . 6 0 3 9 2 2 ,
0 . 8 0 3 9 2 2 ,
0 . 1 9 6 0 7 8 ,
1 . 0 0 0 0 0 0
} ;
#e n d i f
//
COLORS H
1.6.2. Plik szescian5.cpp
/∗
( c )
J a n u s z
G a n c z a r s k i
h t t p : / / www . j a n u s z g . h g . p l
J a n u s z G @ e n t e r . n e t . p l
∗/
#i n c l u d e <GL/ g l u t . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e
” c o l o r s . h ”
//
s t a ł e
do
o b s ł u g i
menu
p o d r ę c z n e g o
enum
{
FULL WINDOW = GL ALWAYS + 1 0 0 ,
//
a s p e k t
o b r a z u − c a ł e
o k n o
ASPECT 1 1 ,
//
a s p e k t
o b r a z u
1 : 1
EXIT
//
w y j ś c i e
} ;
//
a s p e k t
o b r a z u
i n t
a s p e c t = FULL WINDOW ;
//
r o z m i a r y
b r y ł y
o b c i n a n i a
const GLdouble
l e f t = − 2 . 0 ;
const GLdouble
r i g h t = 2 . 0 ;
const GLdouble bottom = − 2 . 0 ;
const GLdouble
t o p = 2 . 0 ;
const GLdouble
n e a r = 3 . 0 ;
const GLdouble
f a r = 7 . 0 ;
1. Bufor głębokości
17
//
k ą t y
o b r o t u
G L f l o a t
r o t a t e x = 0 . 0 ;
G L f l o a t
r o t a t e y = 0 . 0 ;
//
w s k a ź n i k
n a c i ś n i ę c i a
l e w e g o
p r z y c i s k u
m y s z k i
i n t
b u t t o n s t a t e = GLUT UP ;
//
p o ł o ż e n i e
k u r s o r a
m y s z k i
i n t
b u t t o n x , b u t t o n y ;
//
r o d z a j
t e s t u
b u f o r a
g ł ę b o k o ś c i
GLenum d e p t h t e s t = GL LESS ;
//
f u n k c j a
g e n e r u j ą c a
s c e n ę
3D
void
D i s p l a y
( )
{
//
k o l o r
t ł a − z a w a r t o ś ć
b u f o r a
k o l o r u
g l C l e a r C o l o r
( 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ) ;
//
c z y s z c z e n i e
b u f o r a
k o l o r u
i
b u f o r a
g ł ę b o k o ś c i
g l C l e a r
( GL COLOR BUFFER BIT | GL DEPTH BUFFER BIT ) ;
//
w y b ó r
m a c i e r z y
m o d e l o w a n i a
g l M a t r i x M o d e
(GL MODELVIEW ) ;
//
m a c i e r z
m o d e l o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
p r z e s u n i ę c i e
u k ł a d u
w s p ó ł r z ę d n y c h
s z e ś c i a n u
do
ś r o d k a
b r y ł y
o d c i n a n i a
g l T r a n s l a t e f
( 0 , 0 , − ( n e a r+f a r ) / 2 ) ;
//
o b r o t y
s z e ś c i a n u
g l R o t a t e f
( r o t a t e x , 1 . 0 , 0 , 0 ) ;
g l R o t a t e f
( r o t a t e y , 0 , 1 . 0 , 0 ) ;
//
n i e w i e l k i e
p o w i ę k s z e n i e
s z e ś c i a n u
g l S c a l e f
( 1 . 1 5 , 1 . 1 5 , 1 . 1 5 ) ;
//
w ł ą c z e n i e
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l E n a b l e
(GL DEPTH TEST ) ;
//
w y b ó r
f u n k c j i
do
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l D e p t h F u n c
( d e p t h t e s t ) ;
//
r y s o w a n i e
s z e ś c i a n u RGB − 12
t r ó j k ą t ó w
g l B e g i n
(GL TRIANGLES ) ;
g l C o l o r 3 f v
( Red ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( White ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Red ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( White ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Magenta ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Magenta ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( White ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( White ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
1. Bufor głębokości
18
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( White ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Lime ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Lime ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Red ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Red ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Red ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( Magenta ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Lime ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
//
k o n i e c
d e f i n i c j i
s z e ś c i a n u RGB
g l E n d
( ) ;
//
s k i e r o w a n i e
p o l e c e ń
do
w y k o n a n i a
g l F l u s h
( ) ;
//
z a m i a n a
b u f o r ó w
k o l o r u
g l u t S w a p B u f f e r s ( ) ;
}
//
z m i a n a
w i e l k o ś c i
o k n a
void
R esh ape
( i n t
width ,
i n t
h e i g h t )
{
//
o b s z a r
r e n d e r i n g u − c a ł e
o k n o
g l V i e w p o r t
( 0 , 0 , width , h e i g h t ) ;
//
w y b ó r
m a c i e r z y
r z u t o w a n i a
g l M a t r i x M o d e
(GL PROJECTION ) ;
//
m a c i e r z
r z u t o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
p a r a m e t r y
b r y ł y
o b c i n a n i a
i f
( a s p e c t == ASPECT 1 1 )
1. Bufor głębokości
19
{
//
w y s o k o ś ć
o k n a
w i ę k s z a
od
w y s o k o ś c i
o k n a
i f
( w i d t h < h e i g h t && w i d t h > 0 )
g l F r u s t u m
( l e f t , r i g h t , bottom ∗ h e i g h t / width , t o p ∗ h e i g h t / width , n e a r , f a r ) ;
e l s e
//
s z e r o k o ś ć
o k n a
w i ę k s z a
l u b
równa
w y s o k o ś c i
o k n a
i f
( w i d t h >= h e i g h t && h e i g h t > 0 )
g l F r u s t u m
( l e f t ∗ w i d t h / h e i g h t , r i g h t ∗ w i d t h / h e i g h t , bottom , top , n e a r , f a r ) ;
}
e l s e
g l F r u s t u m
( l e f t , r i g h t , bottom , top , n e a r , f a r ) ;
//
g e n e r o w a n i e
s c e n y
3D
D i s p l a y
( ) ;
}
//
o b s ł u g a
k l a w i s z y
f u n k c y j n y c h
i
k l a w i s z y
k u r s o r a
void
S p e c i a l K e y s
( i n t
key ,
i n t x ,
i n t
y )
{
switch
( k e y )
{
//
k u r s o r w l e w o
c a s e GLUT KEY LEFT :
r o t a t e y −= 1 ;
break ;
//
k u r s o r w g ó r ę
c a s e GLUT KEY UP :
r o t a t e x −= 1 ;
break ;
//
k u r s o r w p r a w o
c a s e GLUT KEY RIGHT :
r o t a t e y += 1 ;
break ;
//
k u r s o r w d ó ł
c a s e GLUT KEY DOWN :
r o t a t e x += 1 ;
break ;
}
//
o d r y s o w a n i e
o k n a
R esh ape
( g l u t G e t
(GLUT WINDOW WIDTH) , g l u t G e t
(GLUT WINDOW HEIGHT ) ) ;
}
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
void MouseButton
( i n t
b u t t o n ,
i n t
s t a t e ,
i n t x ,
i n t
y )
{
i f
( b u t t o n == GLUT LEFT BUTTON)
{
//
z a p a m i ę t a n i e
s t a n u
l e w e g o
p r z y c i s k u
m y s z k i
b u t t o n s t a t e = s t a t e ;
//
z a p a m i ę t a n i e
p o ł o ż e n i a
k u r s o r a
m y s z k i
i f
( s t a t e == GLUT DOWN)
{
b u t t o n x = x ;
b u t t o n y = y ;
}
}
}
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
void MouseMotion
( i n t x ,
i n t
y )
{
i f
( b u t t o n s t a t e == GLUT DOWN)
{
r o t a t e y += 30
∗ ( r i g h t − l e f t ) / g l u t G e t
(GLUT WINDOW WIDTH)
∗ ( x − b u t t o n x ) ;
b u t t o n x = x ;
r o t a t e x −= 30
∗ ( t o p − bottom ) / g l u t G e t
(GLUT WINDOW HEIGHT)
∗ ( b u t t o n y − y ) ;
b u t t o n y = y ;
g l u t P o s t R e d i s p l a y
( ) ;
}
}
1. Bufor głębokości
20
//
o b s ł u g a
menu
p o d r ę c z n e g o
void Menu ( i n t
v a l u e )
{
switch
( v a l u e )
{
//
o b s z a r
r e n d e r i n g u − c a ł e
o k n o
c a s e FULL WINDOW :
a s p e c t = FULL WINDOW ;
R esha pe
( g l u t G e t
(GLUT WINDOW WIDTH) , g l u t G e t
(GLUT WINDOW HEIGHT ) ) ;
break ;
//
o b s z a r
r e n d e r i n g u − a s p e k t
1 : 1
c a s e ASPECT 1 1 :
a s p e c t = ASPECT 1 1 ;
R esha pe
( g l u t G e t
(GLUT WINDOW WIDTH) , g l u t G e t
(GLUT WINDOW HEIGHT ) ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL NEVER
c a s e GL NEVER :
d e p t h t e s t = GL NEVER ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i :
GL LESS
c a s e GL LESS :
d e p t h t e s t = GL LESS ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL EQUAL
c a s e GL EQUAL :
d e p t h t e s t = GL EQUAL ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL LEQUAL
c a s e GL LEQUAL :
d e p t h t e s t = GL LEQUAL ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL GREATER
c a s e GL GREATER :
d e p t h t e s t = GL GREATER ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL NOTEQUAL
c a s e GL NOTEQUAL :
d e p t h t e s t = GL NOTEQUAL ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL GEQUAL
c a s e GL GEQUAL :
d e p t h t e s t = GL GEQUAL ;
D i s p l a y
( ) ;
break ;
//
t e s t
b u f o r a
g ł ę b o k o ś c i : GL ALWAYS
c a s e GL ALWAYS :
d e p t h t e s t = GL ALWAYS ;
D i s p l a y
( ) ;
break ;
//
w y j ś c i e
c a s e EXIT :
e x i t
( 0 ) ;
}
}
i n t
main
( i n t
a r g c ,
char ∗ a r g v [ ] )
{
//
i n i c j a l i z a c j a
b i b l i o t e k i
GLUT
g l u t I n i t
(& a r g c , a r g v ) ;
//
i n i c j a l i z a c j a
b u f o r a
r a m k i
g l u t I n i t D i s p l a y M o d e
(GLUT DOUBLE | GLUT RGB | GLUT DEPTH ) ;
1. Bufor głębokości
21
//
r o z m i a r y
g ł ó w n e g o
o k n a
p r o g r a m u
g l u t I n i t W i n d o w S i z e
( 5 0 0 , 5 0 0 ) ;
//
u t w o r z e n i e
g ł ó w n e g o
o k n a
p r o g r a m u
#i f d e f WIN32
g l u t C r e a t e W i n d o w
( ” S z e ś c i a n
5 ” ) ;
#e l s e
g l u t C r e a t e W i n d o w
( ” S z e s c i a n
5 ” ) ;
#e n d i f
//
d o ł ą c z e n i e
f u n k c j i
g e n e r u j ą c e j
s c e n ę
3D
g l u t D i s p l a y F u n c
( D i s p l a y ) ;
//
d o ł ą c z e n i e
f u n k c j i
w y w o ł y w a n e j
p r z y
z m i a n i e
r o z m i a r u
o k n a
g l u t R e s h a p e F u n c
( Re sha pe ) ;
//
d o ł ą c z e n i e
f u n k c j i
o b s ł u g i
k l a w i s z y
f u n k c y j n y c h
i
k l a w i s z y
k u r s o r a
g l u t S p e c i a l F u n c
( S p e c i a l K e y s ) ;
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
g l u t M o u s e F u n c
( MouseButton ) ;
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
g l u t M o t i o n F u n c
( MouseMotion ) ;
//
u t w o r z e n i e
menu
p o d r ę c z n e g o
g l u t C r e a t e M e n u
( Menu ) ;
//
u t w o r z e n i e
podmenu − a s p e k t
o b r a z u
i n t
MenuAspect = g l u t C r e a t e M e n u
( Menu ) ;
#i f d e f WIN32
glutAddMenuEntry
( ” A s p e k t
o b r a z u − c a ł e
okno ” ,FULL WINDOW ) ;
#e l s e
glutAddMenuEntry
( ” A s p e k t
o b r a z u − c a l e
okno ” ,FULL WINDOW ) ;
#e n d i f
glutAddMenuEntry
( ” A s p e k t
o b r a z u
1 : 1 ” , ASPECT 1 1 ) ;
//
u t w o r z e n i e
podmenu − T e s t
z−b u f o r a
i n t
M e n u Z b u f f e r = g l u t C r e a t e M e n u
( Menu ) ;
glutAddMenuEntry
( ”GL NEVER” ,GL NEVER ) ;
glutAddMenuEntry
( ”GL LESS” , GL LESS ) ;
glutAddMenuEntry
( ”GL EQUAL” ,GL EQUAL ) ;
glutAddMenuEntry
( ”GL LEQUAL” ,GL LEQUAL ) ;
glutAddMenuEntry
( ”GL GREATER” ,GL GREATER ) ;
glutAddMenuEntry
( ”GL NOTEQUAL” ,GL NOTEQUAL ) ;
glutAddMenuEntry
( ”GL GEQUAL” ,GL GEQUAL ) ;
glutAddMenuEntry
( ”GL ALWAYS” ,GL ALWAYS ) ;
// menu g ł ó w n e
g l u t C r e a t e M e n u
( Menu ) ;
glutAddSubMenu
( ” A s p e k t
o b r a z u ” , MenuAspect ) ;
glutAddSubMenu
( ” T e s t
z−b u f o r a ” , M e n u Z b u f f e r ) ;
#i f d e f WIN32
glutAddMenuEntry
( ” W y j ś c i e ” , EXIT ) ;
#e l s e
glutAddMenuEntry
( ” W y j s c i e ” , EXIT ) ;
#e n d i f
//
o k r e ś l e n i e
p r z y c i s k u
m y s z k i
o b s ł u g u j ą c e j
menu
p o d r ę c z n e
g l u t A t t a c h M e n u
(GLUT RIGHT BUTTON ) ;
//
w p r o w a d z e n i e
p r o g r a m u
do
o b s ł u g i
p ę t l i
k o m u n i k a t ó w
g l u t M a i n L o o p
( ) ;
return
0 ;
}
Drugi przykładowy program (plik zbufor.cpp) wykorzystuje bufor głę-
bokości do wycięcia wybranego fragmentu sceny 3D. Wycinanie następuje,
gdy wyłączone jest rysowanie w buforze kolorów, ale jednocześnie działa bu-
for głębokości, eliminujący „niewidoczne” elementy sceny 3D. W programie
1. Bufor głębokości
22
rysowana jest kula wewnątrz sześcianu, a wycinany fragment sceny stanowi
kwadratowe okno w jednej ze ścian sześcianu (patrz rysunek 3).
Rysunek 3. Program Z-bufor - obiekt z włączonym przesuwaniem wartości
głębi
Selektywny wybór, który z buforów składających się na bufor koloru
wykorzystywany jest do renderingu umożliwia opisana wcześniej funkcja
glDrawBuffer. Domyślnie w trybach z pojedynczym buforowaniem biblio-
teka OpenGL rysuje w przednim buforze (GL FRONT), a przy włączonym
podwójnym buforowaniu w tylnym buforze (GL BACK).
W programie wykorzystano technikę przesuwania wartości głębi zarówno
przy rysowaniu sześcianu jak i kuli. Jeżeli wyłączymy przesuwanie wartości
głębi przy rysowaniu obiektów położonych w tej samej płaszczyźnie poja-
wią się artefakty przypominające „szwy” (ang. stitching). Są one wyraźnie
widoczne na rysunku 4.
1. Bufor głębokości
23
Rysunek 4. Program Z-bufor - obiekt z wyłączonym przesuwaniem wartości
głębi
Do rysowania niektórych elementów sceny 3D wykorzystane zostały do
tej pory nieopisane funkcje biblioteki GLUT. Kulę, o środku położonym
w początku układu współrzędnych, rysuje funkcja:
void glutSolidSphere (GLdouble radius, GLint slices,
GLint stacks)
której parametry oznaczają:
— radius - promień kuli,
— slices - ilość południków,
— stacks - ilość równoleżników.
Sześcian o środku położonym w początku układu współrzędnych i boku
długości size rysuje funkcja:
void glutSolidCube (GLdouble size)
1. Bufor głębokości
24
Wyjaśnienia wymaga jeszcze sposób realizacji obrotu kuli znajdującej
się wewnątrz sześcianu. Kąt obrotu kuli (zmienna angle) zmieniany jest za
przy każdym wywołaniu funkcji Display. Standardowo funkcja ta jest wy-
woływana tylko w razie potrzeby odrysowania całości lub części okna. Aby
funkcja Display była wywoływana stale, dając efekt obrotu kuli, wykorzy-
stamy każdą bezczynność systemu, czyli tryb oczekiwania przez system na
komunikaty. W bibliotece GLUT wskazanie funkcji wywoływanej podczas
bezczynności systemu umożliwia funkcja:
void glutIdleFunc (void (*func)(void))
1.6.3. Plik zbufor.cpp
/∗
( c )
J a n u s z
G a n c z a r s k i
h t t p : / / www . j a n u s z g . h g . p l
J a n u s z G @ e n t e r . n e t . p l
∗/
#i n c l u d e <GL/ g l u t . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e
” c o l o r s . h ”
//
r o z m i a r y
b r y ł y
o b c i n a n i a
const GLdouble
l e f t = − 2 . 0 ;
const GLdouble
r i g h t = 2 . 0 ;
const GLdouble bottom = − 2 . 0 ;
const GLdouble
t o p = 2 . 0 ;
const GLdouble
n e a r = 3 . 0 ;
const GLdouble
f a r = 7 . 0 ;
//
s t a ł e
do
o b s ł u g i
menu
p o d r ę c z n e g o
enum
{
CUTTING PLANE,
//
p ł a s z c z y z n a
p r z e k r o j u
POLYGON OFFSET,
//
p r z e s u n i ę c i e
w a r t o ś c i
g ł ę b i
EXIT
//
w y j ś c i e
} ;
//
k ą t
o b r o t u
k u l i
G L f l o a t
a n g l e = 0 . 0 ;
//
k ą t y
o b r o t u
s z e ś c i a n u
G L f l o a t
r o t a t e x = 0 . 0 ;
G L f l o a t
r o t a t e y = 0 . 0 ;
//
w s k a ź n i k
r y s o w a n i a
p ł a s z c z y z n a
p r z e k r o j u
bool
c u t t i n g p l a n e = true ;
//
w s k a ź n i k
p r z e s u n i ę c i a
w a r t o ś c i
g ł ę b i
bool
p o l y g o n o f f s e t = true ;
//
w s k a ź n i k
n a c i ś n i ę c i a
l e w e g o
p r z y c i s k u
m y s z k i
i n t
b u t t o n s t a t e = GLUT UP ;
//
p o ł o ż e n i e
k u r s o r a
m y s z k i
i n t
b u t t o n x , b u t t o n y ;
//
f u n k c j a
g e n e r u j ą c a
s c e n ę
3D
void
D i s p l a y
( )
{
//
k o l o r
t ł a − z a w a r t o ś ć
b u f o r a
k o l o r u
1. Bufor głębokości
25
g l C l e a r C o l o r
( 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ) ;
//
c z y s z c z e n i e
b u f o r a
k o l o r u
i
b u f o r a
g ł ę b o k o ś c i
g l C l e a r
( GL COLOR BUFFER BIT | GL DEPTH BUFFER BIT ) ;
//
w y b ó r
m a c i e r z y
m o d e l o w a n i a
g l M a t r i x M o d e
(GL MODELVIEW ) ;
//
m a c i e r z
m o d e l o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
p r z e s u n i ę c i e
u k ł a d u
w s p ó ł r z ę d n y c h
s z e ś c i a n u
do
ś r o d k a
b r y ł y
o d c i n a n i a
g l T r a n s l a t e f
( 0 , 0 , − ( n e a r+f a r ) / 2 ) ;
//
o b r o t y
s z e ś c i a n u
g l R o t a t e f
( r o t a t e x , 1 . 0 , 0 , 0 ) ;
g l R o t a t e f
( r o t a t e y , 0 , 1 . 0 , 0 ) ;
//
n i e w i e l k i e
p o w i ę k s z e n i e
s z e ś c i a n u
g l S c a l e f
( 1 . 1 5 , 1 . 1 5 , 1 . 1 5 ) ;
//
w ł ą c z e n i e
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l E n a b l e
(GL DEPTH TEST ) ;
//
n a j p i e r w
r y s u j e m y
k u l ę
o b r a c a j ą c ą
s i ę
w e w n ą t r z
s z e ś c i a n u ;
//
z
u w a g i
na
c e l o w y
b r a k
e f e k t ó w
o ś w i e t l e n i a ,
o b r ó t
k u l i
//
p o d k r e ś l a
d r u g a
k u l a w
w e r s j i
” s z k i e l e t o w e j ”
g l P u s h M a t r i x
( ) ;
a n g l e += 0 . 2 ;
g l R o t a t e f
( a n g l e , 1 . 0 , 1 . 0 , 0 . 0 ) ;
g l C o l o r 3 f v
( Y e l l o w ) ;
i f
( p o l y g o n o f f s e t )
g l E n a b l e
( GL POLYGON OFFSET FILL ) ;
g l P o l y g o n O f f s e t
( 1 . 0 , 1 . 0 ) ;
g l u t S o l i d S p h e r e
( 0 . 5 , 1 0 , 1 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l u t W i r e S p h e r e
( 0 . 5 , 1 0 , 1 0 ) ;
i f
( p o l y g o n o f f s e t )
g l D i s a b l e
( GL POLYGON OFFSET FILL ) ;
g l P o p M a t r i x ( ) ;
// w
d r u g i e j
k o l e j n o ś c i
r y s u j e m y
w n ę t r z e
s z e ś c i a n u ;
//
r y s o w a n e
s ą
t y l k o
p r z e d n i e
s t r o n y
w e w n ę t r z n y c h
ś c i a n
// no
i
n i e
j e s t
r y s o w a n a
ś c i a n a
p r z e d n i a ,
w
k t ó r e j
b ę d z i e
o t w ó r
g l E n a b l e
( GL CULL FACE ) ;
g l B e g i n
(GL QUADS ) ;
g l C o l o r 3 f v
( B l u e ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Lime ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Green ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l C o l o r 3 f v
( Cyan ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , 1 . 0 ) ;
g l V e r t e x 3 f
( 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l V e r t e x 3 f
( − 1 . 0 , − 1 . 0 , − 1 . 0 ) ;
g l E n d
( ) ;
g l D i s a b l e
( GL CULL FACE ) ;
//
r y s o w a n i e
p ł a s z c z y z n y
o t w o r u w
s z e ś c i a n i e
i f
( c u t t i n g p l a n e )
1. Bufor głębokości
26
{
//
w y ł ą c z e n i e
r y s o w a n i a w
b u f o r z e
k o l o r ó w
g l D r a w B u f f e r
(GL NONE ) ;
//
r y s o w a n i e
k w a d r a t u
c z ę ś c i o w o
o d s ł a n i a j ą c e g o
w n ę t r z e
s z e ś c i a n u
//
( k w a d r a t
j e s t
p o ł o ż o n y
o
0 , 0 0 1
j e d n o s t k i
nad
b o k i e m
s z e ś c i a n u )
g l B e g i n
(GL QUADS ) ;
g l V e r t e x 3 f
( − 0 . 6 , − 0 . 6 , 1 . 0 0 1 ) ;
g l V e r t e x 3 f
( 0 . 6 , − 0 . 6 , 1 . 0 0 1 ) ;
g l V e r t e x 3 f
( 0 . 6 , 0 . 6 , 1 . 0 0 1 ) ;
g l V e r t e x 3 f
( − 0 . 6 , 0 . 6 , 1 . 0 0 1 ) ;
g l E n d
( ) ;
//
w ł ą c z e n i e
r y s o w a n i a w
b u f o r z e
k o l o r ó w
g l D r a w B u f f e r
(GL BACK ) ;
}
//
w ł a ś c i w y
s z e ś c i a n
z
obramowaniem ,
k t ó r e g o
r y s o w a n i e
wymusza
b r a k
o ś w i e t l e n i a
g l C o l o r 3 f v
( Red ) ;
i f
( p o l y g o n o f f s e t )
g l E n a b l e
( GL POLYGON OFFSET FILL ) ;
g l P o l y g o n O f f s e t
( 1 . 0 , 1 . 0 ) ;
g l u t S o l i d C u b e
( 2 . 0 ) ;
g l C o l o r 3 f v
( B l a c k ) ;
g l u t W i r e C u b e
( 2 . 0 ) ;
i f
( p o l y g o n o f f s e t )
g l D i s a b l e
( GL POLYGON OFFSET FILL ) ;
//
s k i e r o w a n i e
p o l e c e ń
do
w y k o n a n i a
g l F l u s h
( ) ;
//
z a m i a n a
b u f o r ó w
k o l o r u
g l u t S w a p B u f f e r s ( ) ;
}
//
z m i a n a
w i e l k o ś c i
o k n a
void
R esh ape
( i n t
width ,
i n t
h e i g h t )
{
//
o b s z a r
r e n d e r i n g u − c a ł e
o k n o
g l V i e w p o r t
( 0 , 0 , width , h e i g h t ) ;
//
w y b ó r
m a c i e r z y
r z u t o w a n i a
g l M a t r i x M o d e
(GL PROJECTION ) ;
//
m a c i e r z
r z u t o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
p a r a m e t r y
b r y ł y
o b c i n a n i a
g l F r u s t u m
( l e f t , r i g h t , bottom , top , n e a r , f a r ) ;
//
g e n e r o w a n i e
s c e n y
3D
D i s p l a y
( ) ;
}
//
o b s ł u g a
k l a w i s z y
f u n k c y j n y c h
i
k l a w i s z y
k u r s o r a
void
S p e c i a l K e y s
( i n t
key ,
i n t x ,
i n t
y )
{
switch
( k e y )
{
//
k u r s o r w l e w o
c a s e GLUT KEY LEFT :
r o t a t e y −= 1 ;
break ;
//
k u r s o r w g ó r ę
c a s e GLUT KEY UP :
r o t a t e x −= 1 ;
break ;
//
k u r s o r w p r a w o
c a s e GLUT KEY RIGHT :
r o t a t e y += 1 ;
break ;
//
k u r s o r w d ó ł
c a s e GLUT KEY DOWN :
r o t a t e x += 1 ;
break ;
1. Bufor głębokości
27
}
//
o d r y s o w a n i e
o k n a
R esh ape
( g l u t G e t
(GLUT WINDOW WIDTH) , g l u t G e t
(GLUT WINDOW HEIGHT ) ) ;
}
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
void MouseButton
( i n t
b u t t o n ,
i n t
s t a t e ,
i n t x ,
i n t
y )
{
i f
( b u t t o n == GLUT LEFT BUTTON)
{
//
z a p a m i ę t a n i e
s t a n u
l e w e g o
p r z y c i s k u
m y s z k i
b u t t o n s t a t e = s t a t e ;
//
z a p a m i ę t a n i e
p o ł o ż e n i a
k u r s o r a
m y s z k i
i f
( s t a t e == GLUT DOWN)
{
b u t t o n x = x ;
b u t t o n y = y ;
}
}
}
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
void MouseMotion
( i n t x ,
i n t
y )
{
i f
( b u t t o n s t a t e == GLUT DOWN)
{
r o t a t e y += 3 0 ∗ ( r i g h t −
l e f t ) / g l u t G e t
(GLUT WINDOW WIDTH)
∗ ( x − b u t t o n x ) ;
b u t t o n x = x ;
r o t a t e x −= 3 0 ∗ ( t o p − bottom ) / g l u t G e t
(GLUT WINDOW HEIGHT)
∗ ( b u t t o n y − y ) ;
b u t t o n y = y ;
g l u t P o s t R e d i s p l a y
( ) ;
}
}
//
o b s ł u g a
menu
p o d r ę c z n e g o
void Menu ( i n t
v a l u e )
{
switch
( v a l u e )
{
//
p ł a s z c z y z n a
p r z e k r o j u
c a s e CUTTING PLANE :
c u t t i n g p l a n e = ! c u t t i n g p l a n e ;
D i s p l a y
( ) ;
break ;
//
p r z e s u n i ę c i e
w a r t o ś c i
g ł ę b i
c a s e POLYGON OFFSET :
p o l y g o n o f f s e t = ! p o l y g o n o f f s e t ;
D i s p l a y
( ) ;
break ;
//
w y j ś c i e
c a s e EXIT :
e x i t
( 0 ) ;
}
}
i n t
main
( i n t
a r g c ,
char ∗ a r g v [ ] )
{
//
i n i c j a l i z a c j a
b i b l i o t e k i
GLUT
g l u t I n i t
(& a r g c , a r g v ) ;
//
i n i c j a l i z a c j a
b u f o r a
r a m k i
g l u t I n i t D i s p l a y M o d e
(GLUT DOUBLE | GLUT RGB | GLUT DEPTH ) ;
//
r o z m i a r y
g ł ó w n e g o
o k n a
p r o g r a m u
g l u t I n i t W i n d o w S i z e
( 5 0 0 , 5 0 0 ) ;
//
u t w o r z e n i e
g ł ó w n e g o
o k n a
p r o g r a m u
g l u t C r e a t e W i n d o w
( ”Z−b u f o r ” ) ;
//
d o ł ą c z e n i e
f u n k c j i
g e n e r u j ą c e j
s c e n ę
3D
g l u t D i s p l a y F u n c
( D i s p l a y ) ;
//
d o ł ą c z e n i e
f u n k c j i
w y w o ł y w a n e j
p r z y
z m i a n i e
r o z m i a r u
o k n a
1. Bufor głębokości
28
g l u t R e s h a p e F u n c
( Re sha pe ) ;
//
d o ł ą c z e n i e
f u n k c j i
o b s ł u g i
k l a w i s z y
f u n k c y j n y c h
i
k l a w i s z y
k u r s o r a
g l u t S p e c i a l F u n c
( S p e c i a l K e y s ) ;
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
g l u t M o u s e F u n c
( MouseButton ) ;
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
g l u t M o t i o n F u n c
( MouseMotion ) ;
//
u t w o r z e n i e
menu
p o d r ę c z n e g o
g l u t C r e a t e M e n u
( Menu ) ;
// menu g ł ó w n e
g l u t C r e a t e M e n u
( Menu ) ;
#i f d e f WIN32
glutAddMenuEntry
( ” P ł a s z c z y z n a
p r z e k r o j u :
r y s o w a n a / n i e r y s o w a n a ” ,CUTTING PLANE ) ;
glutAddMenuEntry
( ” P r z e s u n i ę c i e
w a r t o ś c i
g ł ę b i :
w ł ą c z / w y ł ą c z ” ,POLYGON OFFSET ) ;
glutAddMenuEntry
( ” W y j ś c i e ” , EXIT ) ;
#e l s e
glutAddMenuEntry
( ” P l a s z c z y z n a
p r z e k r o j u :
r y s o w a n a / n i e r y s o w a n a ” ,CUTTING PLANE ) ;
glutAddMenuEntry
( ” P r z e s u n i e c i e
w a r t o s c i
g l e b i :
w l a c z / w y l a c z ” ,POLYGON OFFSET ) ;
glutAddMenuEntry
( ” W y j s c i e ” , EXIT ) ;
#e n d i f
//
o k r e ś l e n i e
p r z y c i s k u
m y s z k i
o b s ł u g u j ą c e j
menu
p o d r ę c z n e
g l u t A t t a c h M e n u
(GLUT RIGHT BUTTON ) ;
//
d o ł ą c z e n i e
f u n k c j i
w y w o ł y w a n e j
p o d c z a s
” b e z c z y n n o ś c i ”
s y s t e m u
g l u t I d l e F u n c
( D i s p l a y ) ;
//
w p r o w a d z e n i e
p r o g r a m u
do
o b s ł u g i
p ę t l i
k o m u n i k a t ó w
g l u t M a i n L o o p
( ) ;
return
0 ;
}
W ostatnim programie przykładowym (plik linie z halo.cpp) przed-
stawimy ciekawy efekt halo, czyli swoistą otoczkę lub poświatę widoczną
przy rysowaniu krawędzi obiektów. Program ten pozwala lepiej zrozumieć
zasadę działania bufora głębokości.
Rysowanie krawędzi obiektu z efektem halo przebiega w dwóch krokach.
Pierwszy z nich polega na narysowaniu pogrubionych krawędzi obiektu przy
włączonym buforze głębokości, ale przy wyłączonym zapisie składowych
RGBA w buforze koloru. Na tak utworzony „obraz” w buforze głębokości
nakładane są już zawężone krawędzie obiektu, przy czym zmianie ulega ro-
dzaj testu na GL LEQUAL (mniejszy lub równy), a samo rysowanie przebiega
przy włączonym zapisie składowych RGBA do bufora koloru.
Efekt halo przedstawia rysunek 5. Dla porównania obiekt ze zwykłymi
krawędziami - ryunek 6.
Wyłączenie i/lub włączenie zapisu składowych RGBA do bufora koloru
realizuje funkcja:
void glColorMask (GLboolean red, GLboolean green,
GLboolean blue, GLboolean alpha)
której parametry logiczne red, green, blue i alpha pozwalają na selektywną
wybór składowych RGBA bufora kolorów. Przy okazji poznajmy funkcję:
void glIndexMask (GLuint mask)
1. Bufor głębokości
29
która jest działającym w trybie indeksowym odpowiednikiem glColorMask.
Parametr mask jest maską bitową sterującą zapisem poszczególnych bitów
indeksów bufora (buforów) kolorów. Wartość 1 bitu maski oznacza możliwość
zapisu danego bitu bufora, wartość 0 blokuje zapis. Domyślnie wszystkie bity
maski mają wartość 1.
Rysunek 5. Program Linie z halo - efekt halo
1.6.4. Plik linie z halo.cpp
/∗
( c )
J a n u s z
G a n c z a r s k i
h t t p : / / www . j a n u s z g . h g . p l
J a n u s z G @ e n t e r . n e t . p l
∗/
#i n c l u d e <GL/ g l u t . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <math . h>
#i n c l u d e
” c o l o r s . h ”
//
s t a ł e
do
o b s ł u g i
menu
p o d r ę c z n e g o
1. Bufor głębokości
30
Rysunek 6. Program Linie z halo - normalne krawędzie
enum
{
FILL ,
//
o b i e k t
w y p e ł n i o n y
WIRE,
//
k r a w ę d z i e
o b i e k t u
HALO,
//
e f e k t
h a l o
EXIT
//
w y j ś c i e
} ;
//
r o z m i a r y
b r y ł y
o b c i n a n i a
const
GLint
l e f t = −5;
const
GLint
r i g h t = 5 ;
const
GLint bottom = −5;
const
GLint
t o p = 5 ;
const
GLint
n e a r = −5;
const
GLint
f a r = 5 ;
//
k ą t y
o b r o t u
s c e n y
G L f l o a t
r o t a t e x = 0 . 0 ;
G L f l o a t
r o t a t e y = 0 . 0 ;
//
w s k a ź n i k
n a c i ś n i ę c i a
l e w e g o
p r z y c i s k u
m y s z k i
i n t
b u t t o n s t a t e = GLUT UP ;
1. Bufor głębokości
31
//
p o ł o ż e n i e
k u r s o r a
m y s z k i
i n t
b u t t o n x , b u t t o n y ;
//
t r y b
r y s o w a n i a
i n t
r e n d e r m o d e = WIRE ;
//
f u n k c j a
g e n e r u j ą c a
s c e n ę
3D
void
D i s p l a y S c e n e
( )
{
//
k o l o r
t ł a − z a w a r t o ś ć
b u f o r a
k o l o r u
g l C l e a r C o l o r
( 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ) ;
//
c z y s z c z e n i e
b u f o r a
k o l o r u
i
b u f o r a
g ł ę b o k o ś c i
g l C l e a r
( GL COLOR BUFFER BIT | GL DEPTH BUFFER BIT ) ;
//
w y b ó r
m a c i e r z y
m o d e l o w a n i a
g l M a t r i x M o d e
(GL MODELVIEW ) ;
//
m a c i e r z
m o d e l o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
o b r o t y
c a ł e j
s c e n y
g l R o t a t e f
( r o t a t e x , 1 . 0 , 0 . 0 , 0 . 0 ) ;
g l R o t a t e f
( r o t a t e y , 0 . 0 , 1 . 0 , 0 . 0 ) ;
//
w ł ą c z e n i e
b u f o r a
g ł ę b o k o ś c i
g l E n a b l e
(GL DEPTH TEST ) ;
//
k o l o r
o b i e k t u
g l C o l o r 4 f v
( Green ) ;
//
n a r y s o w a n i e
w y b r a n y c h
e l e m e n t ó w
s c e n y
switch
( r e n d e r m o d e )
{
//
o b i e k t
w y p e ł n i o n y
c a s e FILL :
g l u t S o l i d S p h e r e
( 3 . 0 , 1 5 , 1 5 ) ;
break ;
//
r y s o w a n i e
t y l k o
k r a w ę d z i
o b i e k t u
c a s e WIRE :
//
w y ł ą c z e n i e
b u f o r a
g ł ę b o k o ś c i
g l D i s a b l e
(GL DEPTH TEST ) ;
//
t r y b
r y s o w a n i a
w i e l o k ą t ó w
g l P o l y g o n M o d e
(GL FRONT AND BACK, GL LINE ) ;
//
s z e r o k o ś ć
l i n i i − l i n i a
n o r m a l n a
g l L i n e W i d t h
( 3 . 0 ) ;
//
n a r y s o w a n i e
o b i e k t u
g l u t S o l i d S p h e r e
( 3 . 0 , 1 5 , 1 5 ) ;
//
t r y b
r y s o w a n i a
w i e l o k ą t ó w
g l P o l y g o n M o d e
(GL FRONT AND BACK, GL FILL ) ;
//
w ł ą c z e n i e
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l E n a b l e
(GL DEPTH TEST ) ;
break ;
//
e f e k t
h a l o
c a s e HALO:
//
t r y b
r y s o w a n i a
w i e l o k ą t ó w
g l P o l y g o n M o d e
(GL FRONT AND BACK, GL LINE ) ;
//
w y ł ą c z e n i e
z a p i s u
do
b u f o r a
k o l o r ó w
g l C o l o r M a s k
( GL FALSE , GL FALSE , GL FALSE , GL FALSE ) ;
//
s z e r o k o ś ć
l i n i i − l i n i a
p o g r u b i o n a
g l L i n e W i d t h
( 9 . 0 ) ;
//
n a r y s o a n i e
o b i e k t u
g l u t S o l i d S p h e r e
( 3 . 0 , 1 5 , 1 5 ) ;
//
w ł ą c z e n i e
z a p i s u
do
b u f o r a
g ł ę b o k o ś c i
1. Bufor głębokości
32
g l C o l o r M a s k
(GL TRUE, GL TRUE, GL TRUE, GL TRUE ) ;
//
s z e r o k o ś ć
l i n i i − l i n i a
n o r m a l n a
g l L i n e W i d t h
( 3 . 0 ) ;
//
r o d z a j
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l D e p t h F u n c
(GL LEQUAL ) ;
//
n a r y s o w a n i e
o b i e k t u
g l u t S o l i d S p h e r e
( 3 . 0 , 1 5 , 1 5 ) ;
//
r o d z a j
t e s t u
b u f o r a
g ł ę b o k o ś c i
g l D e p t h F u n c
( GL LESS ) ;
//
t r y b
r y s o w a n i a
w i e l o k ą t ó w
g l P o l y g o n M o d e
(GL FRONT AND BACK, GL FILL ) ;
break ;
}
//
s k i e r o w a n i e
p o l e c e ń
do
w y k o n a n i a
g l F l u s h
( ) ;
//
z a m i a n a
b u f o r ó w
k o l o r u
g l u t S w a p B u f f e r s ( ) ;
}
//
z m i a n a
w i e l k o ś c i
o k n a
void
R esh ape
( i n t
width ,
i n t
h e i g h t )
{
//
o b s z a r
r e n d e r i n g u − c a ł e
o k n o
g l V i e w p o r t
( 0 , 0 , width , h e i g h t ) ;
//
w y b ó r
m a c i e r z y
r z u t o w a n i a
g l M a t r i x M o d e
(GL PROJECTION ) ;
//
m a c i e r z
r z u t o w a n i a = m a c i e r z
j e d n o s t k o w a
g l L o a d I d e n t i t y
( ) ;
//
p a r a m e t r y
b r y ł y
o b c i n a n i a
g l O r t h o
( l e f t , r i g h t , bottom , top , n e a r , f a r ) ;
//
g e n e r o w a n i e
s c e n y
3D
D i s p l a y S c e n e
( ) ;
}
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
void MouseButton
( i n t
b u t t o n ,
i n t
s t a t e ,
i n t x ,
i n t
y )
{
i f
( b u t t o n == GLUT LEFT BUTTON)
{
//
z a p a m i ę t a n i e
s t a n u
l e w e g o
p r z y c i s k u
m y s z k i
b u t t o n s t a t e = s t a t e ;
//
z a p a m i ę t a n i e
p o ł o ż e n i a
k u r s o r a
m y s z k i
i f
( s t a t e == GLUT DOWN)
{
b u t t o n x = x ;
b u t t o n y = y ;
}
}
}
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
void MouseMotion
( i n t x ,
i n t
y )
{
i f
( b u t t o n s t a t e == GLUT DOWN)
{
r o t a t e y += 50
∗ ( r i g h t − l e f t ) / ( f l o a t ) g l u t G e t
(GLUT WINDOW WIDTH)
∗ ( x − b u t t o n x ) ;
b u t t o n x = x ;
r o t a t e x −= 50
∗ ( t o p − bottom ) / ( f l o a t ) g l u t G e t
(GLUT WINDOW HEIGHT)
∗ ( b u t t o n y − y ) ;
b u t t o n y = y ;
g l u t P o s t R e d i s p l a y
( ) ;
}
}
//
o b s ł u g a
menu
p o d r ę c z n e g o
1. Bufor głębokości
33
void Menu ( i n t
v a l u e )
{
switch
( v a l u e )
{
//
w y b r a n y
t r y b
r y s o w a n i a
c a s e FILL :
c a s e WIRE :
c a s e HALO:
r e n d e r m o d e = v a l u e ;
D i s p l a y S c e n e
( ) ;
break ;
//
w y j ś c i e
c a s e EXIT :
e x i t
( 0 ) ;
}
}
i n t
main
( i n t
a r g c ,
char ∗ a r g v [ ] )
{
//
i n i c j a l i z a c j a
b i b l i o t e k i
GLUT
g l u t I n i t
(& a r g c , a r g v ) ;
//
i n i c j a l i z a c j a
b u f o r a
r a m k i
g l u t I n i t D i s p l a y M o d e
(GLUT DOUBLE | GLUT RGB | GLUT DEPTH ) ;
//
r o z m i a r y
g ł ó w n e g o
o k n a
p r o g r a m u
g l u t I n i t W i n d o w S i z e
( 5 0 0 , 5 0 0 ) ;
//
u t w o r z e n i e
g ł ó w n e g o
o k n a
p r o g r a m u
g l u t C r e a t e W i n d o w
( ” L i n i e
z
h a l o ” ) ;
//
d o ł ą c z e n i e
f u n k c j i
g e n e r u j ą c e j
s c e n ę
3D
g l u t D i s p l a y F u n c
( D i s p l a y S c e n e ) ;
//
d o ł ą c z e n i e
f u n k c j i
w y w o ł y w a n e j
p r z y
z m i a n i e
r o z m i a r u
o k n a
g l u t R e s h a p e F u n c
( Re sha pe ) ;
//
o b s ł u g a
p r z y c i s k ó w
m y s z k i
g l u t M o u s e F u n c
( MouseButton ) ;
//
o b s ł u g a
r u c h u
k u r s o r a
m y s z k i
g l u t M o t i o n F u n c
( MouseMotion ) ;
//
u t w o r z e n i e
podmenu − T r y b
r y s o w a n i a
i n t
MenuRenderMode = g l u t C r e a t e M e n u
( Menu ) ;
#i f d e f WIN32
glutAddMenuEntry
( ” O b i e k t
w y p e ł n i o n y ” , FILL ) ;
glutAddMenuEntry
( ” K r a w ę d z i e
o b i e k t u ” ,WIRE ) ;
glutAddMenuEntry
( ” E f e k t
h a l o ” ,HALO ) ;
#e l s e
glutAddMenuEntry
( ” O b i e k t
w y p e l n i o n y ” , FILL ) ;
glutAddMenuEntry
( ” K r a w e d z i e
o b i e k t u ” ,WIRE ) ;
glutAddMenuEntry
( ” E f e k t
h a l o ” ,HALO ) ;
#e n d i f
// menu g ł ó w n e
g l u t C r e a t e M e n u
( Menu ) ;
glutAddSubMenu
( ” Tryb
r y s o w a n i a ” , MenuRenderMode ) ;
#i f d e f WIN32
glutAddMenuEntry
( ” W y j ś c i e ” , EXIT ) ;
#e l s e
glutAddMenuEntry
( ” W y j s c i e ” , EXIT ) ;
#e n d i f
//
o k r e ś l e n i e
p r z y c i s k u
m y s z k i
o b s ł u g u j ą c e g o
menu
p o d r ę c z n e
g l u t A t t a c h M e n u
(GLUT RIGHT BUTTON ) ;
//
w p r o w a d z e n i e
p r o g r a m u
do
o b s ł u g i
p ę t l i
k o m u n i k a t ó w
g l u t M a i n L o o p
( ) ;
return
0 ;
}
Literatura
34
Literatura
[1] Mark Segal, Kurt Akeley: The OpenGL Graphics System. A Specification
Version 2.0
[2] Jackie Neider, Tom Davis, Mason Woo: OpenGL Programming Guide „The
Red Book”
[3] Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta, Helion 1999
[4] Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta Wydanie III,
Helion 2005
[5] The official OpenGL web page,
[6] Piotr Andrzejewski, Jakub Kurzak: Wprowadzenie do OpenGL. Programowa-
nie zastosowań graficznych, Kwantum 2000
[7] Kevin Hawkins, Dave Astle: OpenGL. Programowanie gier, Helion 2003
[8] Mark J. Kilgard: The OpenGL Utility Toolkit (GLUT) Programming Interface
API Version 3. Silicon Graphics, Inc. 1996