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