opengl mieszanie kolorow

background image

Janusz Ganczarski

OpenGL

Mieszanie kolorów

background image

Spis treści

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

1

1. Mieszanie kolorów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.1.

Włączanie i wyłączanie mieszania kolorów . . . . . . . . . . . . . . .

1

1.2.

Równanie mieszania kolorów . . . . . . . . . . . . . . . . . . . . . .

1

1.3.

Współczynniki mieszania kolorów

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

4

1.4.

Programy przykładowe

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

6

1.4.1.

Plik rownanie mieszania kolorow.cpp . . . . . . . . . . . . .

6

1.4.2.

Plik przezroczystosc.cpp

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

13

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

19

background image

1. Mieszanie kolorów

Biblioteka OpenGL umożliwia mieszanie kolorów (ang. blending), czy-

li ustalanie wynikowego koloru piksela jako kombinacji koloru źródłowego
(R

s

, G

s

, B

s

, A

s

) oraz koloru przeznaczenia (R

d

, G

d

, B

d

, A

d

) przechowywane-

go w buforze kolorów. Z uwagi na dużą rolę w mieszaniu kolorów dotychczas
przez nas nieużywanej składowej alfa (A) koloru, w literaturze można się
także spotkać z angielskim określeniem tej techniki alfa blending.

Mieszanie kolorów wykorzystywane jest m.in. do uzyskania takich efek-

tów jak przezroczystość, antyaliasing i odbicie.

1.1. Włączanie i wyłączanie mieszania kolorów

Mieszanie kolorów jest w bibliotece OpenGL domyślnie wyłączone. Ak-

tywacja mieszania kolorów wymaga wywołania funkcji glEnable z parame-
trem GL BLEND. Analogicznie Wywołanie funkcji glDisable z tym samym
parametrem spowoduje wyłączenie mieszania kolorów.

Z uwagi na korzystania ze składowych alfa kolorów, technika mieszania

kolorów nie jest dostępna, gdy biblioteka OpenGL pracuje w trybie indeksu
kolorów.

1.2. Równanie mieszania kolorów

Domyślnie kolor wynikowy (R, G, B, A) obliczany jest na podstawie po-

niższego równania mieszania kolorów (ang. blend equation):

R = R

s

S

r

+ R

d

D

r

G = G

s

S

g

+ G

d

D

g

B = B

s

S

b

+ B

d

D

b

A = A

s

S

a

+ A

d

D

a

w którym (S

r

, S

g

, S

b

, S

a

) i (D

r

, D

g

, D

b

, D

a

) stanowią odpowiednio współ-

czynniki mieszania dla koloru źródłowego i koloru przeznaczenia. W razie
potrzeby wartości składowych (R, G, B, A) koloru wynikowego odcinane są
do przedziału [0, 1], stąd spotykana inna, bardziej poprawna matematycznie,
forma zapisu tego równania:

R = min (1, R

s

S

r

+ R

d

D

r

)

G = min (1, G

s

S

g

+ G

d

D

g

)

B = min (1, B

s

S

b

+ B

d

D

b

)

A = min (1, A

s

S

a

+ A

d

D

a

)

Wybór innego niż domyślne równania mieszania kolorów umożliwia funk-

cja:

background image

1. Mieszanie kolorów

2

void glBlendEquation (GLenum mode)

której parametr mode może przyjąć jedną z poniższych wartości:
— GL FUNC ADD - domyślne równanie mieszania,
— GL FUNC SUBTRACT - równanie mieszania:

R = max (0, R

s

S

r

− R

d

D

r

)

G = max (0, G

s

S

g

− G

d

D

g

)

B = max (0, B

s

S

b

− B

d

D

b

)

A = max (0, A

s

S

a

− A

d

D

a

)

— GL FUNC REVERSE SUBTRACT - równanie mieszania:

R = max (0, R

d

D

r

− R

s

S

r

)

G = max (0, G

d

D

g

− G

s

S

g

)

B = max (0, B

d

D

b

− B

s

S

b

)

A = max (0, A

d

D

a

− A

s

S

a

)

— GL MIN - równanie mieszania:

R = min (R

s

, R

d

)

G = min (G

s

, G

d

)

B = min (B

s

, B

d

)

A = min (A

s

, A

d

)

— GL MAX - równanie mieszania:

R = max (R

s

, R

d

)

G = max (G

s

, G

d

)

B = max (B

s

, B

d

)

A = max (A

s

, A

d

)

— GL LOGIC OP - równanie mieszania wykorzystuje operację logiczną ◦ wy-

konywaną na bitach składowych pikseli:

R = R

s

◦ R

d

G = G

s

◦ G

d

B = B

s

◦ B

d

A = A

s

◦ A

d

Zauważmy, że równania opisane stałymi GL MIN, GL MAX i LOGIC OP nie

korzystają ze współczynników mieszania.

Operacje logiczne na bitach składowych pikseli są domyślnie wyłączone.

Włączenie operacji logicznych w przypadku, gdy bufor kolorów działa w try-
bie RGB, wymaga wywołania funkcji glEnable z parametrem GL COLOR LO-
GIC OP. Operacje logiczne można także wykonywać na indeksach kolorów,
gdy bufor kolorów pracuje w trybie indeksowym. Wymaga to wywołania
funkcji glEnable z parametrem GL INDEX LOGIC OP.

Wybór operacji logicznej umożliwia funkcja:

background image

1. Mieszanie kolorów

3

void glLogicOp (GLenum opcode)

której wartości parametru opcode i odpowiadające im operacje logiczne na
bitach składowej koloru źródłowego s i bitach składowej koloru przeznacze-
nia d przedstawia tabela 1. Operacja logiczna różnicy symetrycznej XOR
oznaczono symbolem „⊕.” Operacją domyślną jest GL COPY

parametr

operacja logiczna

GL CLEAR

0

GL SET

1

GL COPY

s

GL COPY INVERTED

¬s

GL NOOP

d

GL INVERT

¬d

GL AND

s ∧ d

GL NAND

¬(s ∧ d)

GL OR

s ∨ d

GL NOR

¬(s ∨ d)

GL XOR

s ⊕ d

GL EQUIV

¬(s ⊕ d)

GL AND REVERSE

s ∧ ¬d

GL AND INVERTED

¬s ∧ d

GL OR REVERSE

s ∨ ¬d

GL OR INVERTED

¬s ∨ d

Tabela 1: Operacje logiczne na bitach składowych kolorów

Funkcja glBlendEquation i związana z nią możliwość zmiany równania

mieszania kolorów została wprowadzona w wersji 1.2 biblioteki OpenGL jako
część składową opcjonalnego zbioru funkcji odpowiedzialnych za przetwarza-
nie obrazów (ang. imaging subset), ujętą w jednym rozszerzeniu ARB imaging.
Wcześniej funkcjonalność tę obejmowały rozszerzenia: EXT blend logic op
(równanie GL LOGIC OP), EXT blend subtract (równania GL FUNC SUBTRACT
i GL FUNC REVERSE SUBTRACT) i EXT blend minmax (równania GL MIN i GL -
MAX). W wersji 1.4 OpenGL funkcja glBlendEquation stała się częścią obo-
wiązkowej specyfikacji biblioteki.

W wersji 2.0 biblioteki OpenGL ponownie rozszerzono możliwości mo-

dyfikacji równania mieszania kolorów. Dodana funkcja:

void glBlendEquationSeparate (enum modeRGB, enum modeAlpha)

umożliwia odrębne określenie równania mieszania dla składowych RGB (pa-
rametr modeRGB) i składowej alfa (parametr modeAlpha). Każdy z tych

background image

1. Mieszanie kolorów

4

parametrów może przyjmować niezależnie takie same wartości jak para-
metr funkcji glBlendEquation. Oczywiście, dla obu parametrów warto-
ścią domyślną jest GL FUNC ADD. Wcześniej funkcjonalność tę udostępniało
rozszerzenie EXT blend equation separate oraz mało znane rozszerzenie
ATI blend equation separate. Co ciekawe rozszerzenie firmy ATI zostało
opracowane wcześniej, ale z uwagi na niezgodność (!) z przyjętymi w biblio-
tece OpenGL konwencjami nazewniczymi, nie zostało zaakceptowane przez
innych członków ARB.

1.3. Współczynniki mieszania kolorów

Część z przedstawionych równań mieszania korzystała ze współczynni-

ków mieszania kolorów dla koloru źródłowego (S

r

, S

g

, S

b

, S

a

) i koloru prze-

znaczenia (D

r

, D

g

, D

b

, D

a

). Do określania wartości tych współczynników bi-

blioteka OpenGL posiada specjalne funkcje. Podstawową z nich jest:

void glBlendFunc (GLenum src, GLenum dst)

której parametry src i dst określają sposób obliczania współczynników
mieszania kolorów. Zestawienie dopuszczalnych wartości tych parametrów
przedstawia tabela 2.

parametr

współczynnik mieszania

GL ZERO

(0, 0, 0, 0)

GL ONE

(1, 1, 1, 1)

GL SRC COLOR

(R

s

, G

s

, B

s

, A

s

)

GL ONE MINUS SRC COLOR

(1, 1, 1, 1) − (R

s

, G

s

, B

s

, A

s

)

GL DST COLOR

(R

d

, G

d

, B

d

, A

d

)

GL ONE MINUS DST COLOR

(1, 1, 1, 1) − (R

d

, G

d

, B

d

, A

d

)

GL SRC ALPHA

(A

s

, A

s

, A

s

, A

s

)

GL ONE MINUS SRC ALPHA

(1, 1, 1, 1) − (A

s

, A

s

, A

s

, A

s

)

GL DST ALPHA

(A

d

, A

d

, A

d

, A

d

)

GL ONE MINUS DST ALPHA

(1, 1, 1, 1) − (A

d

, A

d

, A

d

, A

d

)

GL CONSTANT COLOR

(R

c

, G

c

, B

c

, A

c

)

GL ONE MINUS CONSTANT COLOR

(1, 1, 1, 1) − (R

c

, G

c

, B

c

, A

c

)

GL CONSTANT ALPHA

(A

c

, A

c

, A

c

, A

c

)

GL ONE MINUS CONSTANT ALPHA

(1, 1, 1, 1) − (A

c

, A

c

, A

c

, A

c

)

GL SRC ALPHA SATURATE

(f, f, f, 1) , f = min (A

s

, 1 − A

d

)

Tabela 2: Wartości parametrów funkcji glBlendFunc

Wartość początkowa dla parametru src wynosi GL ONE. Wartość począt-

kowa dla parametru dst wynosi GL ZERO.

background image

1. Mieszanie kolorów

5

Stała GL SRC ALPHA SATURATE może być stosowana wyłącznie jako war-

tość parametru src. Pozostałe wartości można stosować do obu parametrów
funkcji glBlendFunc. Całkowitą dowolność w ich wyborze wprowadzono do-
piero w wersji 1.4 biblioteki OpenGL. W wcześniejszych wersjach OpenGL
parametr sfactor nie mógł przyjmować wartości SRC COLOR i ONE MINUS -
SRC COLOR, a parametr dfactor wartości DST COLOR i ONE MINUS DST COLOR.
Natomiast możliwość taką udostępniało początkowo rozszerzenie NV blend -
square.

Podobnie jak w przypadku definiowania odrębnych równań mieszania ko-

lorów dla składowych RGB i składowej alfa, OpenGL od wersji 1.4 umożliwia
zdefiniowanie odrębnych współczynników mieszania kolorów dla składowych
RGB koloru źródłowego i koloru przeznaczenia oraz dla składowych alfa obu
kolorów. Wymaga to wywołania funkcji:

void glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB,

GLenum srcAlpha, GLenum dstAlpha)

której parametry srcRGB i dstRGB określają współczynniki mieszania składo-
wych RGB koloru źródłowego i koloru przeznaczenia, a parametry srcAlpha
i dstAlpha współczynniki mieszania składowych alfa tych kolorów. Para-
metry funkcji glBlendFuncSeparate pozostają takie same jak parametry
funkcji glBlendFunc. Analogiczne są także ograniczenia dotyczące stoso-
wania stałej GL SRC ALPHA SATURATE tylko w zakresie parametrów srcRGB
i srcAlpha. Podobnie wartość początkowa parametrów srcRGB i srcAlpha
wynosi GL ONE, a parametrów dstRGB i dstAlpha — GL ZERO. Całość była
wcześniej ujęta w rozszerzeniu EXT blend func separate.

Ostatnim wymagającym opisu elementem mechanizmu mieszania kolo-

rów są wymienione w tabeli 2 stałe: GL CONSTANT COLOR, GL ONE MINUS -
CONSTANT COLOR, GL CONSTANT ALPHA i GL ONE MINUS CONSTANT ALPHA, po-
wiązane z wartościami (R

c

, G

c

, B

c

, A

c

). Ich użycie umożliwia wybranie do-

wolnej wartości współczynników mieszania składowych RGBA, a wartości
te definiuje się przy użyciu funkcji:

void glBlendColor (clampf red, clampf green, clampf blue,

clampf alpha)

Wartość początkowa współczynników (R

c

, G

c

, B

c

, A

c

) wynosi (0, 0, 0, 0).

Stałe GL CONSTANT COLOR, GL ONE MINUS CONSTANT COLOR, GL CONSTANT -

ALPHA i GL ONE MINUS CONSTANT ALPHA zostały wprowadzone w wersji 1.2
biblioteki OpenGL jako część składowa wspomnianego wyżej opcjonalnego
zbioru funkcji przetwarzania obrazów (rozszerzenie ARB imaging). Wcze-
śniej ich obsługę wprowadzono w rozszerzeniu EXT blend color. Stałe te
wprowadzono do obowiązkowej części specyfikacji w wersji 1.4 biblioteki
OpenGL.

background image

1. Mieszanie kolorów

6

1.4. Programy przykładowe

Pierwszy program przykładowy (plik rownanie mieszania kolorow.cpp)

przedstawia efekty działania wybranych równań mieszania kolorów. Okno
programu (rysunek 1) podzielone jest na dwie części. Lewa część, pokoloro-
wana na niebiesko, zawiera nazwy zastosowanych równań mieszania kolorów.
Prawa część okna jest pokolorowana na zielono. Na wysokości każdego napisu
określającego nazwę równania mieszania kolorów program rysuje prostokąt
czerwony przecinający zarówno niebieską jak i zieloną część okna. Daje to
możliwość wizualnego porównania efektów działania poszczególnych równań
mieszania kolorów. Dodatkowo na prostokątach wynikowych wypisane są
szesnastkowo wartość składowych RGB.

1.4.1. Plik rownanie mieszania kolorow.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 <GL/ g l e x t . h>
#i f n d e f WIN32
#d e f i n e GLX GLXEXT LEGACY
#i n c l u d e <GL/ g l x . h>
#d e f i n e

w g l G e t P r o c A d d r e s s

glXGetProcAddressARB

#e n d i f
#i n c l u d e
< s t d l i b . h>
#i n c l u d e < s t d i o . h>
#i n c l u d e

” c o l o r s . h ”

//

w s k a ź n i k

na

f u n k c j ę

g l B l e n d E q u a t i o n

PFNGLBLENDEQUATIONEXTPROC g l B l e n d E q u a t i o n = NULL ;

//

s t a ł e

do

o b s ł u g i

menu

p o d r ę c z n e g o

enum

{

EXIT

//

w y j ś c i e

} ;

//

i l o ś ć

” f u n k c j i ”

m i e s z a n i a

k o l o r ó w

const

i n t

f u n c c o u n t = 2 3 ;

//

n a z w y

” f u n k c j i ”

m i e s z a n i a

k o l o r ó w

char ∗ f u n c

[ f u n c c o u n t ] =

{

”SOURCE” ,
”DEST” ,
”ADD” ,
”MIN” ,
”MAX” ,
”SUBTRACT” ,
”REVERSE SUBTRACT” ,
”CLEAR” ,
”SET” ,
”COPY” ,
”COPY INVERTED” ,
”NOOP” ,
”INVERT” ,
”AND” ,
”NAND” ,
”OR” ,
”NOR” ,
”XOR” ,

background image

1. Mieszanie kolorów

7

Rysunek 1. Program Równanie mieszania kolorów

”EQUIV” ,
”AND REVERSE” ,
”AND INVERTED” ,
”OR REVERSE” ,
”OR INVERTED”

} ;

void

D r a w S t r i n g

( const char ∗ s t r i n g )

{

i n t

i ;

f o r

( i = 0 ;

s t r i n g [ i ] ;

i ++)

g l u t B i t m a p C h a r a c t e r ( GLUT BITMAP 9 BY 15 ,

s t r i n g [ i ] ) ;

}

//

f u n k c j a

r y s u j ą c a

n a p i s w wybranym

m i e j s c u

void

D r a w S t r i n g

( GLint x ,

GLint y ,

char ∗ s t r i n g )

background image

1. Mieszanie kolorów

8

{

//

p o ł o ż e n i e

n a p i s u

g l R a s t e r P o s 2 i

( x , y ) ;

//

w y ś w i e t l e n i e

n a p i s u

i n t

l e n = s t r l e n

( s t r i n g ) ;

f o r

( i n t

i = 0 ;

i < l e n ;

i ++)

g l u t B i t m a p C h a r a c t e r

( GLUT BITMAP 9 BY 15 , s t r i n g

[ i ] ) ;

}

//

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

( )

{

//

p o b r a n i e

s z e r o k o ś c i

i

w y s o k o ś c i

o b r a z u w

p i k s e l a c h

i n t

w i d t h = g l u t G e t

(GLUT WINDOW WIDTH ) ;

i n t

h e i g h t = g l u t G e t

(GLUT WINDOW HEIGHT ) ;

//

z a b e z p i e c z e n i e

p r z e d

p r ó b ą

r y s o w a n i a w z m i n i m a l i z o w a n y m

o k n i e

i f

( w i d t h == 0

| |

h e i g h t == 0 )

return ;

//

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

( 0 . 0 , 1 . 0 , 0 . 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

g l C l e a r

( GL COLOR BUFFER BIT ) ;

//

k o l o r

l e w e j

p o ł o w y

o k n a

g l C o l o r 4 f v

( B l u e ) ;

g l R e c t i

( 0 , 0 , 1 8 0 + ( width − 2 0 0 ) / 2 , h e i g h t ) ;

//

o b l i c z e n i a

k r o k u

w s p ó ł r z ę d n e j

p i o n o w e j

p o ł o ż e n i a

//

n a p i s ó w

i n f o r m a c y j n y c h

z

n a zw ą ” f u n k c j i ”

m i e s z a n i a

k o l o r ó w

//

o r a z

z

k o l o r a m i

p r o s t o k ą t ó w

w y n i k o w y c h

//

( 1 5 t o

w y s o k o ś ć

c z c i o n k i

u ż y t e j

w

f u n k c j i

D r a w S t r i n g )

i n t

s t e p y = h e i g h t

/

f u n c c o u n t ;

i n t

y = h e i g h t − ( s t e p y − 1 5 )

/ 2 − 1 5 ;

//

k o l o r

r y s o w a n y c h

p r o s t o k ą t ó w

g l C o l o r 4 f v

( Red ) ;

//

p i e r w s z y

p r o s t o k ą t

r y s o w a n y

p r z y

w y ł ą c z o n y m

m i e s z n i u

k o l o r ó w

g l R e c t i

( 1 8 0 , h e i g h t −1∗ s t e p y , width −20 , h e i g h t −0∗ s t e p y ) ;

//

w ł ą c z e n i e

m i e s z a n i a

k o l o r ó w

g l E n a b l e (GL BLEND ) ;

//

w s p ó ł c z y n n i k i

m i e s z a n i a

k o l o r ó w

g l B l e n d F u n c

(GL ONE , GL ONE ) ;

g l R e c t i

( 1 8 0 , h e i g h t −2∗ s t e p y , width −20 , h e i g h t −1∗ s t e p y ) ;

//

r ó w n a n i e GL FUNC ADD

g l B l e n d E q u a t i o n

(GL FUNC ADD ) ;

g l R e c t f

( 1 8 0 , h e i g h t −3∗ s t e p y , width −20 , h e i g h t −2∗ s t e p y ) ;

//

r ó w n a n i e GL MIN

g l B l e n d E q u a t i o n

( GL MIN ) ;

g l R e c t f

( 1 8 0 , h e i g h t −4∗ s t e p y , width −20 , h e i g h t −3∗ s t e p y ) ;

//

r ó w n a n i e GL MAX

g l B l e n d E q u a t i o n

(GL MAX ) ;

g l R e c t f

( 1 8 0 , h e i g h t −5∗ s t e p y , width −20 , h e i g h t −4∗ s t e p y ) ;

//

r ó w n a n i e GL FUNC SUBTRACT

g l B l e n d E q u a t i o n

(GL FUNC SUBTRACT ) ;

g l R e c t f

( 1 8 0 , h e i g h t −6∗ s t e p y , width −20 , h e i g h t −5∗ s t e p y ) ;

//

r ó w n a n i e GL FUNC REVERSE SUBTRACT

g l B l e n d E q u a t i o n

(GL FUNC REVERSE SUBTRACT ) ;

g l R e c t f

( 1 8 0 , h e i g h t −7∗ s t e p y , width −20 , h e i g h t −6∗ s t e p y ) ;

//

w s p ó ł c z y n n i k i

m i e s z a n i a

k o l o r ó w

g l B l e n d F u n c

(GL ONE , GL ZERO ) ;

//

w ł ą c z e n i e

o p e r a c j i

l o g i c z n y c h

na

b i t a c h

s k ł a d o w y c h

p i k s e l i

g l E n a b l e

( GL COLOR LOGIC OP ) ;

//

o p e r a c j a

l o g i c z n a

GL CLEAR

g l L o g i c O p

(GL CLEAR ) ;

background image

1. Mieszanie kolorów

9

g l R e c t f

( 1 8 0 , h e i g h t −8∗ s t e p y , width −20 , h e i g h t −7∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL SET

g l L o g i c O p

( GL SET ) ;

g l R e c t f

( 1 8 0 , h e i g h t −9∗ s t e p y , width −20 , h e i g h t −8∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL COPY

g l L o g i c O p

(GL COPY ) ;

g l R e c t f

( 1 8 0 , h e i g h t −10∗ s t e p y , width −20 , h e i g h t −9∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL COPY INVERTED

g l L o g i c O p

(GL COPY INVERTED ) ;

g l R e c t f

( 1 8 0 , h e i g h t −11∗ s t e p y , width −20 , h e i g h t −10∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL NOOP

g l L o g i c O p

(GL NOOP ) ;

g l R e c t f

( 1 8 0 , h e i g h t −12∗ s t e p y , width −20 , h e i g h t −11∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL INVERT

g l L o g i c O p

( GL INVERT ) ;

g l R e c t f

( 1 8 0 , h e i g h t −13∗ s t e p y , width −20 , h e i g h t −12∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL AND

g l L o g i c O p

(GL AND ) ;

g l R e c t f

( 1 8 0 , h e i g h t −14∗ s t e p y , width −20 , h e i g h t −13∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL NAND

g l L o g i c O p

(GL NAND ) ;

g l R e c t f

( 1 8 0 , h e i g h t −15∗ s t e p y , width −20 , h e i g h t −14∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL OR

g l L o g i c O p

(GL OR ) ;

g l R e c t f

( 1 8 0 , h e i g h t −16∗ s t e p y , width −20 , h e i g h t −15∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL NOR

g l L o g i c O p

(GL NOR ) ;

g l R e c t f

( 1 8 0 , h e i g h t −17∗ s t e p y , width −20 , h e i g h t −16∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a GL XOR

g l L o g i c O p

(GL XOR ) ;

g l R e c t f

( 1 8 0 , h e i g h t −18∗ s t e p y , width −20 , h e i g h t −17∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL EQUIV

g l L o g i c O p

( GL EQUIV ) ;

g l R e c t f

( 1 8 0 , h e i g h t −19∗ s t e p y , width −20 , h e i g h t −18∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL AND REVERSE

g l L o g i c O p

(GL AND REVERSE ) ;

g l R e c t f

( 1 8 0 , h e i g h t −20∗ s t e p y , width −20 , h e i g h t −19∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL AND INVERTED

g l L o g i c O p

(GL AND INVERTED ) ;

g l R e c t f

( 1 8 0 , h e i g h t −21∗ s t e p y , width −20 , h e i g h t −20∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL OR REVERSE

g l L o g i c O p

(GL OR REVERSE ) ;

g l R e c t f

( 1 8 0 , h e i g h t −22∗ s t e p y , width −20 , h e i g h t −21∗ s t e p y ) ;

//

o p e r a c j a

l o g i c z n a

GL OR INVERTED

g l L o g i c O p

(GL OR INVERTED ) ;

g l R e c t f

( 1 8 0 , h e i g h t −23∗ s t e p y , width −20 , h e i g h t −22∗ s t e p y ) ;

//

w y ł ą c z e n i e

o p e r a c j i

l o g i c z n y c h

na

b i t a c h

s k ł a d o w y c h

p i k s e l i

g l D i s a b l e

( GL COLOR LOGIC OP ) ;

//

w y ł ą c z e n i e

m i e s z a n i a

k o l o r ó w

g l D i s a b l e (GL BLEND ) ;

//

w y ś w i e t l a n i e

n a p i s ó w

i n f o r m a c y j n y c h :

r o d z a j

” f u n k c j i ”

//

m i e s z a n i a

k o l o r ó w

o r a z

s k ł a d o w e RGB k o l o r ó w

p r o s t o k ą t ó w

w y n i k o w y c h

GLubyte

r g b

[ 3 ] ;

char

s t r i n g

[ 2 0 ] ;

f o r

( i n t

i = 0 ;

i < f u n c c o u n t ;

i ++)

{

//

r o d z a j

” f u n k c j i ”

m i e s z a n i a

k o l o r ó w

g l C o l o r 4 f v

( White ) ;

D r a w S t r i n g

( 1 0 , y , f u n c

[ i ] ) ;

//

k o l o r

p i e r w s z e g o

p r o s t o k ą t a

w y n i k o w e g o

g l R e a d P i x e l s

( 1 8 0 , h e i g h t −( i +1)∗ s t e p y , 1 , 1 , GL RGB, GL UNSIGNED BYTE , r g b ) ;

background image

1. Mieszanie kolorów

10

s p r i n t f

( s t r i n g ,

”(%2X,%2X,%2X) ” , r g b [ 0 ] , r g b [ 1 ] , r g b [ 2 ] ) ;

//

k o l o r

n a p i s u w n e g a t y w i e z a w s z e

w i d o c z n y

g l C o l o r 3 u b

(255 − r g b [ 0 ] , 2 5 5 − r g b [ 1 ] , 2 5 5 − r g b [ 2 ] ) ;

D r a w S t r i n g

( 2 1 0 , y , s t r i n g ) ;

//

k o l o r

d r u g i e g o

p r o s t o k ą t a

w y n i k o w e g o

g l R e a d P i x e l s

( width −21 , h e i g h t −( i +1)∗ s t e p y , 1 , 1 , GL RGB, GL UNSIGNED BYTE , r g b ) ;

s p r i n t f

( s t r i n g ,

”(%2X,%2X,%2X) ” , r g b [ 0 ] , r g b [ 1 ] , r g b [ 2 ] ) ;

//

k o l o r

n a p i s u w n e g a t y w i e z a w s z e

w i d o c z n y

g l C o l o r 3 u b

(255 − r g b [ 0 ] , 2 5 5 − r g b [ 1 ] , 2 5 5 − r g b [ 2 ] ) ;

D r a w S t r i n g

( width −140 , y , s t r i n g ) ;

//

w s p ó ł r z ę d n e

n a s t ę p n e g o

w i e r s z a

n a p i s ó w

y −= s t e p y ;

}

//

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

( ) ;

//

r z u t o w a n i e

p r o s t o k ą t n e

g l u O r t h o 2 D

( 0 , width , 0 , h e i g h t ) ;

//

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

menu

p o d r ę c z n e g o

void Menu ( i n t

v a l u e )

{

i f

( v a l u e == EXIT )

e x i t

( 0 ) ;

}

//

s p r a w d z e n i e

i

p r z y g o t o w a n i e

o b s ł u g i

w y b r a n y c h

r o z s z e r z e ń

void

E x t e n s i o n S e t u p

( )

{

//

p o b r a n i e

numeru

w e r s j i

b i b l i o t e k i

OpenGL

const char ∗ v e r s i o n = ( char ∗ ) g l G e t S t r i n g

( GL VERSION ) ;

//

o d c z y t

w e r s j i

OpenGL

i n t

m a j o r = 0 ,

m i n o r = 0 ;

i f

( s s c a n f

( v e r s i o n , ”%d.%d ” ,& major ,& m i n o r )

!=

2 )

{

#i f d e f WIN32

p r i n t f

( ” Błędny

f o r m a t

w e r s j i

OpenGL\n ” ) ;

#e l s e

p r i n t f

( ” B l e d n y

f o r m a t

w e r s j i

OpenGL\n ” ) ;

#e n d i f

e x i t

( 0 ) ;

}

//

s p r a w d z e n i e

c z y

j e s t

c o

n a j m n i e j

w e r s j a

1 . 4

i f

( m a j o r > 1

| |

m i n o r >= 4 )

{

//

p o b r a n i e

w s k a ź n i k a

f u n k c j i

g l B l e n d E q u a t i o n

g l B l e n d E q u a t i o n =

(PFNGLBLENDEQUATIONPROC)

w g l G e t P r o c A d d r e s s

( ” g l B l e n d E q u a t i o n ” ) ;

background image

1. Mieszanie kolorów

11

}

e l s e

//

s p r a w d z e n i e

c z y

s ą

o b s ł u g i w a n e

r o z s z e r z e n i a :

//

E X T b l e n d m i n m a x ,

E X T b l e n d l o g i c o p

i

E X T b l e n d s u b t r a c t

i f

( g l u t E x t e n s i o n S u p p o r t e d

( ” GL EXT blend minmax ” ) &&

g l u t E x t e n s i o n S u p p o r t e d

( ” G L E X T b l e n d l o g i c o p ” ) &&

g l u t E x t e n s i o n S u p p o r t e d

( ” G L E X T b l e n d s u b t r a c t ” ) )

{

//

p o b r a n i e

w s k a ź n i k a

f u n k c j i

g l B l e n d E q u a t i o n

g l B l e n d E q u a t i o n =

(PFNGLBLENDEQUATIONPROC)

w g l G e t P r o c A d d r e s s

( ” g lBl e ndE q u at io nE X T ” ) ;

}

e l s e

{

p r i n t f

( ” Brak

r o z s z e r z e n i a

EXT blend minmax ! \ n ” ) ;

p r i n t f

( ” Brak

r o z s z e r z e n i a

E X T b l e n d l o g i c o p ! \ n ” ) ;

p r i n t f

( ” Brak

r o z s z e r z e n i a

E X T b l e n d s u b t r a c t ! \ n ” ) ;

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

//

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 , 6 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

( ” Równanie

m i e s z a n i a

k o l o r ó w ” ) ;

#e l s e

g l u t C r e a t e W i n d o w

( ” Rownanie

m i e s z a n i a

k o l o r o w ” ) ;

#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 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 ( R es hape ) ;

// 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

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

//

s p r a w d z e n i e

i

p r z y g o t o w a n i e

o b s ł u g i

w y b r a n y c h

r o z s z e r z e ń

E x t e n s i o n S e t u p

( ) ;

//

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 i ostatni przykładowy program (plik przezroczystosc.cpp) przed-

stawia sposób uzyskiwania efektu przezroczystości przy użyciu mieszania
kolorów. Program wyświetla cztery kule (patrz rysunek 2), z których dwie
są nieprzezroczyste a dwie częściowo przezroczyste. Wykorzystano przy tym
definicje materiałów zawarte w pliku materials.h. Obiekty można obracać
za pomocą lewego przycisku myszki.

background image

1. Mieszanie kolorów

12

Aby uzyskać prawidłowo działający efekt przezroczystości obiektów trze-

ba wykonać szereg operacji. Przede wszystkim w pierwszej kolejności rysuje-
my wszystkie obiekty nieprzezroczyste. Przed przystąpieniem do rysowania
obiektów przezroczystych trzeba włączyć mieszanie kolorów oraz ustawić
współczynniki mieszania kolorów na GL SRC ALPHA dla koloru źródłowego
i GL ONE MINUS SRC ALPHA dla koloru przeznaczenia. Korzystanie z miesza-
nia kolorów przy rysowaniu obiektów trójwymiarowych wymaga także wyłą-
czenia zapisu współrzędnych z do bufora głębokości przy użyciu opisywanej
już funkcji glDepthMask. Niestety aby obiekty przezroczyste były prawi-
dłowo renderowane należy je rysować w kolejności od najdalej położonego
względem osi Z.

Rysunek 2. Program Przezroczystość - przykładowy ekran

Poprawne posortowanie większej ilości obiektów 3D może być głównym

problemem przy korzystaniu z efektu przezroczystości. W przykładowym
programie o kolejności rysowania dwóch przezroczystych kul decyduje war-

background image

1. Mieszanie kolorów

13

tość kąta obrotu wokół osi X (graniczne wartości kątów dobrano eksperymen-
talnie). Jest to oczywiście rozwiązanie dostosowane do realiów wyświetlanej
sceny i nie ma niestety żadnych cech uniwersalności.

Warto jeszcze dodać, że przezroczysta kula rysowana jest w specjalny

sposób. Polega to na dwukrotnym rysowaniu kuli - pierwszy raz z wyłącze-
niem rysowania tylnych stron wielokątów (funkcja glCullFace), i drugi raz
z wyłączeniem rysowania przednich stron wielokątów. W połączeniu z włą-
czoną opcją oświetlenia obu stron wielokątów daje to w efekcie prawidłowy
obraz bez żadnych niekorzystnych efektów związanych ze sposobem definio-
wania obiektów przez bibliotekę GLUT.

1.4.2. Plik przezroczystosc.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 <GL/ g l u . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e

” m a t e r i a l 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

{

//

o b s z a r

r e n d e r i n g u

FULL WINDOW,

//

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 ;

//

k ą t y

o b r o t u

o b i e k t ó w

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 ;

//

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 ;

//

i d e n t y f i k a t o r y

l i s t

w y ś w i e t l a n i a

GLint GOLD SPHERE ;
GLint RUBY SPHERE ;

//

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. Mieszanie kolorów

14

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

( ) ;

//

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 ł ą c z e n i e

o ś w i e t l e n i a

g l E n a b l e

( GL LIGHTING ) ;

//

w ł ą c z e n i e

ś w i a t ł a

GL LIGHT0 z

p a r a m e t r a m i

d o m y ś l n y m i

g l E n a b l e

( GL LIGHT0 ) ;

//

o ś w i e t l e n i e

t y l k o

p r z e d n i c h

s t r o n

w i e l o k ą t ó w

g l L i g h t M o d e l f

( GL LIGHT MODEL TWO SIDE , GL FALSE ) ;

//

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

o b i e k t 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

o b i e k t ó w

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

//

o d ł o ż e n i e

m a c i e r z y

m o d e l o w a n i a

na

s t o s

g l P u s h M a t r i x

( ) ;

//

p r z e s u n i ę c i e

p i e r w s z e j

k u l i

g l T r a n s l a t e f

( 1 . 2 , 0 . 0 , 0 . 0 ) ;

//

p i e r w s z a

k u l a z ł o t a

g l C a l l L i s t

(GOLD SPHERE ) ;

//

z d j ę c i e

m a c i e r z y

m o d e l o w a n i a

z e

s t o s u

g l P o p M a t r i x

( ) ;

//

o d ł o ż e n i e

m a c i e r z y

m o d e l o w a n i a

na

s t o s

g l P u s h M a t r i x

( ) ;

//

p r z e s u n i ę c i e

d r u g i e j

k u l i

g l T r a n s l a t e f

( − 1 . 2 , 0 . 0 , 0 . 0 ) ;

//

d r u g a

k u l a z ł o t a

g l C a l l L i s t

(GOLD SPHERE ) ;

//

z d j ę c i e

m a c i e r z y

m o d e l o w a n i a

z e

s t o s u

g l P o p M a t r i x

( ) ;

//

o ś w i e t l e n i e

p r z e d n i c h

i

t y l n y c h

s t r o n

w i e l o k ą t ó w

g l L i g h t M o d e l f

( GL LIGHT MODEL TWO SIDE , GL TRUE ) ;

//

w ł ą c z e n i e

m i e s z a n i a

k o l o r ó w

g l E n a b l e

(GL BLEND ) ;

//

w s p ó ł c z y n n i k i

m i e s z a n i a

k o l o r ó w

g l B l e n d F u n c

( GL SRC ALPHA , GL ONE MINUS SRC ALPHA ) ;

//

w y ł ą c z e n i e

z a p i s u

w s p ó ł r z ę d n y c h

z

do

b u f o r a

g ł ę b o k o ś c i

glDepthMask

( GL FALSE ) ;

//

o d ł o ż e n i e

m a c i e r z y

m o d e l o w a n i a

na

s t o s

g l P u s h M a t r i x

( ) ;

//

o b l i c z e n i e

k ą t a

o b r o t u

w o k ó ł

o x X ,

//

w a r t o ś ć

k ą t a

o g r a n i c z o n a

do

p r z e d z i a ł u

[ 0 , 3 6 0 ]

i n t

a n g l e x = ( i n t ) r o t a t e x % 3 6 0 ;

i f

( a n g l e x < 0 )

a n g l e x += 3 6 0 ;

//

p r z e s u n i ę c i e

t r z e c i e j

k u l i

u z a l e ż n i o n e

od

j e j

p o ł o ż e n i a

//

w z g l ę d e m

c z w a r t e j

k u l i ;

k ą t y

50

i

1 3 0

d o b r a n e

e k s p e r y m e n t a l n i e

i f

( a n g l e x > 50 && a n g l e x < 1 3 0 )

g l T r a n s l a t e f

( 0 . 0 , − 1 . 2 , 0 . 0 ) ;

e l s e

background image

1. Mieszanie kolorów

15

g l T r a n s l a t e f

( 0 . 0 , 1 . 2 , 0 . 0 ) ;

//

t r z e c i a

k u l a r u b i n o w a

g l C a l l L i s t

(RUBY SPHERE ) ;

//

z d j ę c i e

m a c i e r z y

m o d e l o w a n i a

z e

s t o s u

g l P o p M a t r i x

( ) ;

//

o d ł o ż e n i e

m a c i e r z y

m o d e l o w a n i a

na

s t o s

g l P u s h M a t r i x

( ) ;

//

p r z e s u n i ę c i e

c z w a r t e j

k u l i

u z a l e ż n i o n e

od

j e j

p o ł o ż e n i a

//

w z g l ę d e m

t r z e c i e j

k u l i ;

k ą t y

50

i

1 3 0

d o b r a n e

e k s p e r y m e n t a l n i e

i f

( a n g l e x > 50 && a n g l e x < 1 3 0 )

g l T r a n s l a t e f

( 0 . 0 , 1 . 2 , 0 . 0 ) ;

e l s e

g l T r a n s l a t e f

( 0 . 0 , − 1 . 2 , 0 . 0 ) ;

//

c z w a r t a

k u l a r u b i n o w a

g l C a l l L i s t

(RUBY SPHERE ) ;

//

z d j ę c i e

m a c i e r z y

m o d e l o w a n i a

z e

s t o s u

g l P o p M a t r i x

( ) ;

//

w ł ą c z e n i e

z a p i s u

w s p ó ł r z ę d n y c h

z

do

b u f o r a

g ł ę b o k o ś c i

glDepthMask

(GL TRUE ) ;

//

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 )

{

//

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

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 ;

background image

1. Mieszanie kolorów

16

}

}

}

//

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

( ) ;

}

}

//

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 ;

//

w y j ś c i e

c a s e EXIT :

e x i t

( 0 ) ;

}

}

//

u t w o r z e n i e

l i s t

w y ś w i e t l a n i a

void

G e n e r a t e D i s p l a y L i s t s

( )

{

//

g e n e r o w a n i e

i d e n t y f i k a t o r a

p i e r w s z e j

l i s t y

w y ś w i e t l a n i a

GOLD SPHERE = g l G e n L i s t s

( 1 ) ;

//

p i e r w s z a

l i s t a

w y ś w i e t l a n i a z ł o t a

k u l a

g l N e w L i s t

(GOLD SPHERE, GL COMPILE ) ;

//

u s t a w n i e n i e

m a t e r i a ł u o b i e k t

n i e p r z e z r o c z y s t y

g l M a t e r i a l f v

(GL FRONT AND BACK, GL AMBIENT, GoldAmbient ) ;

g l M a t e r i a l f v

(GL FRONT AND BACK, GL DIFFUSE , G o l d D i f f u s e ) ;

g l M a t e r i a l f v

(GL FRONT AND BACK, GL SPECULAR, G o l d S p e c u l a r ) ;

g l M a t e r i a l f

(GL FRONT AND BACK, GL SHININESS , G o l d S h i n i n e s s ) ;

//

n a r y s o w a n i e

n i e p r z e z r o c z y s t e j

k u l i

g l u t S o l i d S p h e r e

( 0 . 8 , 2 0 , 2 0 ) ;

//

k o n i e c

p i e r w s z e j

l i s t y

w y ś w i e t l a n i a

g l E n d L i s t

( ) ;

//

g e n e r o w a n i e

i d e n t y f i k a t o r a

d r u g i e j

l i s t y

w y ś w i e t l a n i a

RUBY SPHERE = g l G e n L i s t s

( 1 ) ;

//

d r u g a

l i s t a

w y ś w i e t l a n i a r u b i n o w a

k u l a

g l N e w L i s t

(RUBY SPHERE, GL COMPILE ) ;

//

u s t a w n i e n i e

m a t e r i a ł u o b i e k t

p r z e z r o c z y s t y

g l M a t e r i a l f v

(GL FRONT AND BACK, GL AMBIENT, RubyAmbient ) ;

g l M a t e r i a l f v

(GL FRONT AND BACK, GL DIFFUSE , R u b y D i f f u s e ) ;

g l M a t e r i a l f v

(GL FRONT AND BACK, GL SPECULAR, R u b y S p e c u l a r ) ;

g l M a t e r i a l f

(GL FRONT AND BACK, GL SHININESS , R u b y S h i n i n e s s ) ;

//

w ł ą c z e n i e

r e n d e r i n g u

w y b r a n e j

s t r o n y

w i e l o k ą t a

g l E n a b l e

( GL CULL FACE ) ;

//

r y s o w a n i e

t y l k o

p r z e d n i e j

s t r o n y

w i e l o k ą t ó w

background image

1. Mieszanie kolorów

17

g l C u l l F a c e

(GL BACK ) ;

//

n a r y s o w a n i e

p i e r w s z e j

p r z e z r o c z y s t e j

k u l i

g l u t S o l i d S p h e r e

( 0 . 8 , 2 0 , 2 0 ) ;

//

r y s o w a n i e

t y l k o

t y l n e j

s t r o n y

w i e l o k ą t ó w

g l C u l l F a c e

(GL FRONT ) ;

//

n a r y s o w a n i e

d r u g i e j

p r z e z r o c z y s t e j

k u l i

g l u t S o l i d S p h e r e

( 0 . 8 , 2 0 , 2 0 ) ;

//

w y ł ą c z e n i e

r e n d e r i n g u

w y b r a n e j

s t r o n y

w i e l o k ą t a

g l D i s a b l e

( GL CULL FACE ) ;

//

k o n i e c

d r u g i e j

l i s t y

w y ś w i e t l a n i a

g l E n d L i s t

( ) ;

}

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

#i f d e f WIN32

g l u t C r e a t e W i n d o w

( ” P r z e z r o c z y s t o ś ć ” ) ;

#e l s e

g l u t C r e a t e W i n d o w

( ” P r z e z r o c z y s t o s c ” ) ;

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

//

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

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

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

//

u t w o r z e n i e

l i s t

w y ś w i e t l a n i a

background image

1. Mieszanie kolorów

18

G e n e r a t e D i s p l a y L i s t s

( ) ;

//

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

19

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:
mieszanie kolorów i tecza
mieszanie kolorów
Bardzo kolorowa sałatka warstwowa lub mieszana, Przepisy
Ustalanie składu mieszanki betonowej1
Kolorowanka Letnie igrzyska olimpijskie Gimnastyka artystyczna
Napęd mieszadła ślimakowego projekt, OBL
Grafika komputerowa i OpenGL
5 MIESZANKA BETONOWA
jesien kolorowanka1
Nie kaz mi myslec O zyciowym podejsciu do funkcjonalnosci stron internetowych Wydanie II Edycja kolo
Napęd mieszadła ślimakowego projekt, 3

więcej podobnych podstron