opengl bufor glebokosci

background image

Janusz Ganczarski

OpenGL

Bufor głębokości

background image

Spis treści

Spis treści . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1. Bufor głębokości . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.1.

Działanie bufora głębokości . . . . . . . . . . . . . . . . . . . . . . .

1

1.2.

Włączenie bufora głębokości

. . . . . . . . . . . . . . . . . . . . . .

1

1.3.

Test bufora głębokości . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.4.

Czyszczenie bufora głębokości

. . . . . . . . . . . . . . . . . . . . .

2

1.4.1.

Zakres wartości bufora głębokości . . . . . . . . . . . . . . .

3

1.5.

Przesunięcie wartości głębi . . . . . . . . . . . . . . . . . . . . . . .

3

1.6.

Programy przykładowe

. . . . . . . . . . . . . . . . . . . . . . . . .

4

1.6.1.

Plik colors.h . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.6.2.

Plik szescian5.cpp . . . . . . . . . . . . . . . . . . . . . . . .

16

1.6.3.

Plik zbufor.cpp

. . . . . . . . . . . . . . . . . . . . . . . . .

24

1.6.4.

Plik linie z halo.cpp . . . . . . . . . . . . . . . . . . . . . . .

29

Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

background image

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.

background image

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).

background image

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.

background image

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-

background image

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 :

background image

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

} ;

background image

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

} ;

background image

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

} ;

background image

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 ] =

{

background image

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 ] =

{

background image

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 ] =

{

background image

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

} ;

background image

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

} ;

background image

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

background image

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 ] =

{

background image

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 ;

background image

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 ) ;

background image

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 )

background image

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

( ) ;

}

}

background image

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 ) ;

background image

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

zb 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

background image

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.

background image

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)

background image

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

background image

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 )

background image

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 ;

background image

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

background image

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)

background image

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

background image

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 ;

background image

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

background image

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

background image

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 ;

}

background image

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,

http://www.opengl.org

[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


Document Outline


Wyszukiwarka

Podobne podstrony:
opengl bufor akumulacyjny
opengl bufor szablonowy
Grafika komputerowa i OpenGL
OSTATECZNA Łukowska, M (2011) Mechanizmy kontroli głębokości zanurzenia przestrzennego w środowisko
Głęboki peeling ziołowy
Zadania z OpenGL do wykonania
13 Wyznaczenie glebokosci ulozenia przewodow metoda posrednia
opengl nurbs
Jak spać głęboko i pozbyć się stresu
21 Wyjaśnij pojęcia rozpiętość produktu, linia produktowa, głębokość i zawartość produktu
METODY OSZACOWANIA GŁĘBOKOŚCI PRZEBICIA
opengl test zaslaniania
Ogranicznik głębokości wiercenia
Struktura powierzchniowa i struktura gleboka, Filologia polska, Językoznawstwo
ROŚLINY WODNE STREFY GŁĘBOKIEJ, Architektura krajobrazu, Rośliny ozdobne
OpenGL Leksykon kieszonkowy opgllk

więcej podobnych podstron