Bufor szablonowy

Transkrypt

Bufor szablonowy
Laboratorium nr 10
Instrukcja
Laboratoryjna
4
1/4
Programowanie Grafiki Komputerowej
Temat: Bufor szablonowy
Przygotował: mgr inż. Grzegorz Pawiński
1) Bufor szablonowy
Bufor szablonowy (ang. Stencil Buffer) umożliwia tworzenie specjalnego szablonu
definiującego obszar, do którego ograniczone będzie rysowanie sceny. Obszar określony jest w
buforze koloru i może zostać wypełniony dowolnym kształtem (rzutem).
1.1)
Włączenie bufora szablonowego
Przed korzystaniem z bufora szablonowego należy najpierw go uaktywnić. Pierwzsą
czynnością jaką należy wykonać jest dodanie do wywołania funkcji glutInitDisplayMode() stałej
GLUT_STENCIL. Następnie należy użyć funkcji glEnable() z parametrem GL_STENCIL_TEST,
aby włączyć bufor akumulacyjny. Wyłączenie polega na wywołaniiu funkcji glDisable() z tym
samym parametrem.
1.2)
Czyszczenie bufora szablonowego
Zawartość bufora szablonowego można czyścić, podobnie jak zawartość innych buforów,
używając funkcji glClear() z parametrem GL_STENCIL_BUFFER_BIT. Domyślnie wypełniany
jest zerami.
1.3)
Test szablonu
Podczas testu szablonu, przekazywana wartość progowa porównywana jest z wartością
znajdującą się już w buforze szablonu. Test realizuje funkcja:
void glStencilFunc (GLenum func, GLint ref, GLuint mask)
Laboratorium nr 10
2/4
Pierwszy parametr func wskazuje rodzaj zastosowanej funkcji testującej i może przyjąć
następujące wartości:
Parametr func
Opis
GL_NEVER
Wartość testu nigdy nie spełniona
GL_LESS
Spełniona, jeśli ref < od wartości bufora
GL_LEQUAL
Spełniona, jeśli ref <= od wartości bufora
GL_GREATER
Spełniona, jeśli ref > od wartości bufora
GL_GEQUAL
Spełniona, jeśli ref >= od wartości bufora
GL_EQUAL
Spełniona, jeśli ref == od wartości bufora
GL_NOTEQUAL
Spełniona, jeśli ref != od wartości bufora
GL_ALWAYS
Wartość testu zawsze spełniona
Parametr ref określa wartość referencyjną, według której następuje w teście porównanie.
Maska bitowa, przekazywana w parametrze mask określa bity, dla których wykonywany jest test
szablonu. Wartości testowanych bitów mnożone są logicznie przez wartości maski, dzięki czemu
obszar jest ograniczony do bitów maski przyjmujących wartość logiczną 1.
Po przeprowadzonym teście należy jeszcze określić akcje jakie mają zostać wykonane w
przypadku, gdy test został spełniony, bądź nie. Funkcja określająca akcje wykonane po teście:
void glStencilOp (GLenum sfail, GLenum dpfail, GLenum dppass)
Parametry określają rodzaj akcji wykonanej na buforze szablonowym w przypadku:
•
niespełnienia testu bufora szablonu (sfail),
•
spełnienia testu bufora szablonu przy niespełnionym teście bufora głębokości (dpfail),
•
spełnienia testu bufora szablonu i bufora głębokości (dppass).
Laboratorium nr 10
3/4
Każdy z parametrów może przyjąć jedną z poniższych wartości:
1.4)
Wartość parametru
Opis
GL_KEEP
Zachowaj dotychczasową wartość
GL_ZERO
Zastąp zerami
GL_REPLACE
Zastąp wartością progową
GL_INCR
Zwiększ
GL_DECR
Zmniejsz
GL_INVERT
Odwróc (negacja bitowa)
Zapis w buforze koloru
Funkcja umożliwiająca włączenie i wyłączenie zapisu składowych RGBA w buforze koloru:
void glColorMask(r, g, b, a)
Parametry mogą przyjmować wartości GL_TRUE (włączenie zapisu) i GL_FALSE
(wyłączenie zapisu).
Laboratorium nr 10
1.5)
Przykład
/******* WYPEŁNIENIE BUFORA SZABLONOWEGO************/
//włączenie bufora szablonowego
glEnable (GL_STENCIL_TEST);
glDisable (GL_DEPTH_TEST);
/** zapamiętanie w buforze obiektu **/
glStencilFunc (GL_ALWAYS,0x00000001,0xFFFFFFFF);
glStencilOp (GL_REPLACE,GL_REPLACE,GL_REPLACE);
//wyłączenie zapisu w buforze koloru //narysowanie powierzchni odbicia //włączenie zapisu w buforze koloru glEnable (GL_DEPTH_TEST);
/*** porównanie rysowanego obiektu 3D z zawartością bufora ***/
glStencilFunc (GL_EQUAL,0x00000001,0xFFFFFFFF);
glStencilOp (GL_KEEP,GL_KEEP,GL_KEEP);
/** narysowanie odbicia na nowej warstwie **/
//przesunięcie obiektu 3D za lustro // obrót odbicia w przeciwną stronę //narysowanie obiektu 3D /** narysowanie odbicia na nowej warstwie **/
/*** porównanie rysowanego obiektu 3D z zawartością bufora ***/
//wyłączenie bufora szablonowego
glDisable (GL_STENCIL_TEST);
/** wyświetlenie przezroczystej powierzchni odbicia **/
/** wyświetlenie obiektu 3D przed lustrem **/
4/4

Podobne dokumenty