OpenGL - Bufor g ebokosci i bufor szablonowy

34
OpenGL Bufor glębokości i bufor szablonowy Miroslaw Glowacki 1,2 1 Akademia Górniczo-Hutnicza im. Stanislawa Staszica w Krakowie Wydzial Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania 2 Uniwersytet im. Jana Kochanowskiego w Kielcach Wydzial Nauk Ścislych i Przyrodniczych Instytut Fizyki Zaklad Fizyki Komputerowej i Informatyki Maj 2017 / Styczeń 2022 Miroslaw Glowacki (AGH, UJK) OpenGL 2017-2022 1 / 34

Transcript of OpenGL - Bufor g ebokosci i bufor szablonowy

Page 1: OpenGL - Bufor g ebokosci i bufor szablonowy

OpenGL

Bufor głębokości i bufor szablonowy

Mirosław Głowacki 1,2

1Akademia Górniczo-Hutnicza im. Stanisława Staszica w KrakowieWydział Inżynierii Metali i Informatyki StosowanejKatedra Informatyki Stosowanej i Modelowania

2Uniwersytet im. Jana Kochanowskiego w KielcachWydział Nauk Ścisłych i Przyrodniczych

Instytut FizykiZakład Fizyki Komputerowej i Informatyki

Maj 2017 / Styczeń 2022

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 1 / 34

Page 2: OpenGL - Bufor g ebokosci i bufor szablonowy

Spis treści

1 Bufor głębokości i bufor szablonowy

2 Bufor głębokości (depth buffer)

3 Bufor szablonowy (stencil buffer)

4 Odbicie zwierciadlane

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 2 / 34

Page 3: OpenGL - Bufor g ebokosci i bufor szablonowy

Spis treści

1 Bufor głębokości i bufor szablonowy

2 Bufor głębokości (depth buffer)

3 Bufor szablonowy (stencil buffer)

4 Odbicie zwierciadlane

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 3 / 34

Page 4: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości i bufor szablonowy

Do chwili obecnej dokonywaliśmy zmian jedynie w jednymbuforze wyjściowym - buforze kolorów.Obecnie omówimy dwa dodatkowe bufory, bufor głębokości ibufor szablonowy.Dla każdego z nich zostanie przedstawiony typowy problemrozwiązywalny przy pomocy tego bufora.Aby zademonstrowac zalety buforów, posłużymy się obiektemprzestrzennym w postaci sześcianu.Należy w tym celu zmodyfikować shader wierzchołków tak, abyakceptował trzecią współrzędną:

in vec3 position;...gl_Position = proj * view * model *

vec4(position, 1.0);

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 4 / 34

Page 5: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości i bufor szablonowyKonieczne będą również pewne zmiany shadera fragmentów.Ściany sześcianu zostaną pokryte zmieszaną teksturą kotka ipieska na tle ich własnego koloru:

vec4 texColor = mix(texture(texKitten, Texcoord),texture(texPuppy, Texcoord), 0.5);

outColor = texColor * vec4(Color, 1.0);

Wierzchołki opisywane będą teraz 8 atrybutami, więc należyteż zaktualizować rozmiar i przesunięcia danych - np.:

float vertices[] = {// X Y Z R G B U V

-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

-0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f};

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 5 / 34

Page 6: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości i bufor szablonowy

Zamieszczone danewierzchołków dotyczą tylkojednej ściany sześcianu.Sześcian będzie wymagał36 wierzchołków ( 6 ścian* 2 trójkąty * 3wierzchołki) - każda ścianabędzie opisana analogicznie.Nie będziemy korzystać zbufora elementów, więcużyjemy funkcjiglDrawArrays :

glDrawArrays(GL_TRIANGLES,0, 36);

Uzyskany efekt nie jestzadowalający - brak zasłanianiapowierzchni niewidocznych

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 6 / 34

Page 7: OpenGL - Bufor g ebokosci i bufor szablonowy

Spis treści

1 Bufor głębokości i bufor szablonowy

2 Bufor głębokości (depth buffer)

3 Bufor szablonowy (stencil buffer)

4 Odbicie zwierciadlane

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 7 / 34

Page 8: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Staje się jasne, że obraz nie jest wyświetlany zgodnie zoczekiwaniami.Problem polega na tym, że kiedy OpenGL rysuje trójkątsześcianu nadpisuje nowymi pikselami to, co zostało wcześniejnarysowane.W tym przypadku OpenGL renderuje poszczególne trójkątyniezależnie czy są z tyłu czy z przodu.Na szczęście OpenGL oferuje sposoby decydowania o tym kiedypiksel ma być widoczny, a kiedy nie.Dwa najważniejsze to:

test bufora głębokości,test bufora szablonowego.

Proces zwany z-buforowaniem jest sposobem na śledzeniegłębokości każdego piksela na ekranie.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 8 / 34

Page 9: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Głębokość jest proporcjonalna do odległości pomiędzypłaszczyzną ekranu a fragmentem, który jest narysowany.Oznacza to, że fragmenty dalsze mają większą głębię, podczasgdy fragmenty bliżej niższą.Jeśli głębokość piksela jest przechowywana wraz z jego kolorem,fragmenty rysowane później mogą się pojawić lub nie.Porównanie ich głębokości z głębokością istniejącą pozwalaustalić, czy nowy fragment leży bliżej obserwatora niż stary.Jeśli tak, należy go zobrazować, a w przeciwnym razie można gopo prostu odrzucić.

Operacj ta znana jest pod nazwą testu głębokości .

OpenGL oferuje sposób przechowywania wartości głębokości wdodatkowym buforze, zwanym buforem głębokości lub z-buforemi przeprowadza automatyczne testowanie fragmentów.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 9 / 34

Page 10: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Ma to wpływ na inne operacje - przykładowo moduł cieniującynie bierze pod uwagę niewidocznych fragmentów, co maznaczący wpływ na wydajność renderingu.Test głębokości nie jest domyślnie włączony, ale można tozmienić przez proste wywołanie funkcji glEnable .

glEnable(GL_DEPTH_TEST);

Po włączeniu tej funkcjonalności po raz pierwszy i uruchomieniuaplikacji zostanie wyświetlony czarny ekran.Dzieje się tak, ponieważ bufor głębokości domyślnie jestwypełniony watością 0 , co oznacza, że głębokość każdegopiksela jest głębokością kamery.Ponieważ żadne fragmenty nie będą bliżej - wszystkie zostająodrzucane.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 10 / 34

Page 11: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Bufor głębokości może zostaćwypełniony wartością 1.0f wtrakcie wypełniania bufora kolorów.1.0f jest głębokością tylnejpłaszczyzny obcinania - największejmożliwej głębokości.Wszystkie fragmenty będą bliżej.Można to uzyskać rozszerzającwywołanie funkcji glClear zdwoma spośród czterech parametrów(dwa pozostałe toGL_STENCIL_BUFFER_BIT iGL_ACCUM_BUFFER_BIT):

W takiej sytuacji włączenietestu głębokości przynosi

zadowalający efekt

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 11 / 34

Page 12: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Funkcja glClear powinna być użyta przed każdym włączeniemtestowania głębokości - w przeciwnym razie będą brane poduwagę wartości głębokości z ostatniej klatki.Istnieje możliwość przeprowadzienia testu głębokości nawszystkich fragmentach bez aktualizacji bufora głębokości, czylipraca z buforem głębokości w trybie readonly.Należy wtedy wyłączyć zapis do bufora, ustawiając maskęgłębokości na GL_FALSE przy pomocy funkcji glDepthMask :

glDepthMask(GL_FALSE);

OpenGL pozwala również zmieniać operatory porównania,których używa do testu głębokości, co prowadzi do kontroliwarunków odrzucania fragmentów i aktualizacji buforagłębokości.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 12 / 34

Page 13: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Służy do tego funkcja glDepthFunc domyślnie używana zparametrem GL_LESS, co powoduje odrzucenie fragmentów,których głębokość jest większa lub równa bieżącej wartościzapisanej w buforze głębokości.

glDepthFunc(GL_LESS);

Funkcja akceptuje kilka operatorów porównania, dla których testgłębokości przechodzi pomyślnie:

GL_ALWAYS - zawsze.GL_NEVER - nigdy.GL_LESS - jeśli głębokość fragmentu jest mniejsza niż zapisanaw buforze głębokości.GL_EQUAL - jeśli głębokość fragmentu jest równa zapisanej wbuforze głębokości.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 13 / 34

Page 14: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor głębokości

Test głębokości przechodzi pomyślnie również dla operatorów:GL_LEQUAL - jeśli głębokość fragmentu jest mniejsza lub równazapisanej w buforze głębokości.GL_GREATER - jeśli głębokość fragmentu jest większa odzapisanej w buforze głębokości.GL_NOTEQUAL - jeśli głębokość fragmentu jest nierównazapisanej w buforze głębokości.GL_GEQUAL - jeśli głębokość fragmentu jest większa lub równazapisanej w buforze głębokości.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 14 / 34

Page 15: OpenGL - Bufor g ebokosci i bufor szablonowy

Spis treści

1 Bufor głębokości i bufor szablonowy

2 Bufor głębokości (depth buffer)

3 Bufor szablonowy (stencil buffer)

4 Odbicie zwierciadlane

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 15 / 34

Page 16: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor szablonowy

Bufor szablonowy jest opcjonalnym rozszerzeniem buforagłębokości, który zapewnia większą kontrolę nad tym, którefragmenty powinny być rysowane, a które nie powinny.Podobnie jak w przypadku bufora głębokości, bufor szablonowyzawiera wartość dla każdego piksela, ale tym razem programistadecyduje kiedy i jak zmienia się ta wartość i jaki ma wpływ naobrazowanie fragmentu.

Zauważmy, że jeśli test głębokości nie powiedzie się, testowaniebufora szablonowego nie ma wpływu na obrazowanie fragmentu, alefragmenty mogą nadal wpływać na wartości w buforze szablonowym.

Aby lepiej poznać bufor szablonowy, zacznijmy od analizyprostego przykładu.Na początek bufor szablonowy zostanie wypełniony zerami, atylko jego część - prostokąt - wypełniają wartości 1 .

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 16 / 34

Page 17: OpenGL - Bufor g ebokosci i bufor szablonowy

Bufor szablonowyOperacja rysowania sześcianu wykorzystuje wartości z buforuszablonowego do rysowania tych fragmentów, dla którychwartości bufora szablonowego wynoszą 1 .

Testowanie bufora szablonowego jest możliwe dopiero powywołaniu funkcji glEnable , podobnie jak to miało miejsce wprzypadku testu głębokości.

glEnable(GL_STENCIL_TEST);

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 17 / 34

Page 18: OpenGL - Bufor g ebokosci i bufor szablonowy

Funkcje obsługi bufora szablonowego

Wartości w buforze szablonowym można kontrolować za pomocąfunkcji:

glStencilFunc,glStencilOp,glStencilMask.

Funkcja glStencilFunc określa warunki, w jakich fragmentprzechodzi test bufora szablonowego - jej parametrami są:

func - operator testowy - jeden z analogicznych jak dla buforagłębokości: GL_NEVER , GL_LESS , GL_LEQUAL , GL_GREATER ,GL_GEQUAL , GL_EQUAL , GL_NOTEQUAL i GL_ALWAYS .ref - wartość referencyjna, z którą jest porównywana zawartośćbufora szablonowego przy użyciu funkcji testowej.mask - przed porównaniem zawartości bufora szblonowego zwartością referencyjną, jest dokonywana operacja mnożeniabitowego AND tej maski z obu wymienionymi wartościami.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 18 / 34

Page 19: OpenGL - Bufor g ebokosci i bufor szablonowy

Funkcje obsługi bufora szablonowegoPrzykładowo - jeśli wynik testu ma być pozytywny, dla wartościrównych bądź większych od 2 należy użyć funkcji:

glStencilFunc(GL_GEQUAL, 2, 0xFF);

Ponieważ wszystkie bity maski dla bufora 8-bitowego zostałyustawione na 1 , wynikiem mnożenia są pierwotne wartości imaska nie ma wpływu na test.funkcja glStencilOp określa, jakim modyfikacjom powinnypodlegać wartości bufora szablonowego, w zależności od wynikutestów buforów szablonowego i głębokości - parametry sąnastępujące:

sfail - działanie jakie należy wykonać jeśli test buforaszablonowego nie powiedzie się.dpfail - działanie jakie należy wykonać jeśli test buforaszablonowego zakończy się pomyślnie, a test głębokości nie.dppass - działanie, jakie należy wykonać, jeśli testy: szablonowei głębokości zakończą się pomyślnie.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 19 / 34

Page 20: OpenGL - Bufor g ebokosci i bufor szablonowy

Funkcje obsługi bufora szablonowegoWartości bufora można modyfikować w następujący sposób:

GL_KEEP - bieżąca wartość jest zachowywana.GL_ZERO - wartość szablonu jest ustawiana na 0 .GL_REPLACE - wartość szablonu jest ustawiana na wartośćreferencyjną polecenia glStencilFunc .GL_INCR - wartość szablonu zwiększa się o 1 , jeżeli jest niższaod wartości maksymalnejGL_INCR_WRAP - tak jak GL_INCR , ale po przekroczeniumaksymalnej wartość będzie ustawiona na 0 .GL_DECR - wartość szablonu jest zmniejszana o 1 , jeśli jestwiększa niż 0 .GL_DECR_WRAP - podobnie jak GL_DECR , ale jeśli bieżącawartość wynosi 0 będzie ona ustawiona na wartość maksymalną- zawsze są to liczby całkowite bez znaku.GL_INVERT - do wartości stosuje się odwracające odwzorowaniebitowe.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 20 / 34

Page 21: OpenGL - Bufor g ebokosci i bufor szablonowy

Funkcje obsługi bufora szablonowego

Wreszcie, funkcja glStencilMask jest używana do kontrolibitów zapisywanych do bufora szablonowego, gdy jestwykonywana jedna z operacji funkcji glStencilOp

Jej parametrem jest maska bitowa włączająca i wyłączającapisanie dla poszczególnych bitów jednostek bufora.Początkowo wszystkie bity maski są ustawione na 1 ( 0xFF dlacałego bufora 8 bitowego), co oznacza, że nie ma ona wpływuna wynik jakiejkolwiek operacji.Jeśli przykładowo należy ustawić na 1 te wartości w obszarzebufora szablonowego, dla których wyniki testów szblonowego igłębokości były pozytywne to wymagany jest ciąg instrukcji:

glStencilFunc(GL_ALWAYS, 1, 0xFF);glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);glStencilMask(0xFF);

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 21 / 34

Page 22: OpenGL - Bufor g ebokosci i bufor szablonowy

Funkcje obsługi bufora szablonowego

Ustawianie bufora szablonowego nie powinno mieć (i w naszymprzkładzie nie ma) wpływu na bufor kolorów, dopiero użyciebufora szablonowego powoduje zmiany bufora kolorów.Pomocna staje się tu funkcja glColorMask , która decyduje,jakie dane są zapisywane w buforze kolorów podczas operacjirysowania.

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);glDepthMask(GL_FALSE);

W omawianym przypadku wyłączono wszystkie kanały kolorów:czerwonego, zielonego, niebieskiego i alfa.Zapisywanie do bufora głębokości należy wyłączyć oddzielnieprzy pomocy funkcji glDepthMask , tak aby operacja rysowaniasześcianu nie miała wpływu na wartości głębokości.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 22 / 34

Page 23: OpenGL - Bufor g ebokosci i bufor szablonowy

Zastosowanie bufora szablonowego

Wracając do rysunku fragmentu sześcianu, można stwierdzić, żedzięki wiedzy na temat ustawiania wartości bufora szablonowego,jego używanie do testowania fragmentów staje się proste.Najpierw należy włączyć zapis do bufora kolorów i buforagłębokości, a następnie ustawić funkcję testową decydującą otym, które fragmenty będą widoczne.Funkcja:

glStencilFunc(GL_EQUAL, 1, 0xFF);

spowoduje, że test bufora szablonowego będzie pozytywny dlapikseli, dla których zawartość tego bufora wynosi 1 .Fragment zostanie narysowany, gdy pomyślnie przejdzie testy:obu buforów szblonowego i głębokości.Użycie glStencilOp nie jest tutaj konieczne, gdyż buforszablonowy nie będzie modyfikowany.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 23 / 34

Page 24: OpenGL - Bufor g ebokosci i bufor szablonowy

Zastosowanie bufora szablonowego

W naszym przykładzie wartości w buforze szablonowym zostałyustawione na 1 jedynie w obszarze prostokąta, więc tylko w tymobszarze fragmenty przchodzą pozytywnie test buforaszablonowego i zostaną zobrazowane.

Szczegółem, który można łatwo przeoczyć, jest to, że akcja rysowaniasześcianu może niekiedy wpływać na zawartość bufora szablonowego.

Aby tego uniknąć, należy ustawić maskę bufora szablonu na 0 .

glStencilMask(0x00);

Parametr funkcji glStencilMask gwarantuje, że że żaden bitbufora szblonowego nie zostanie zmieniony.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 24 / 34

Page 25: OpenGL - Bufor g ebokosci i bufor szablonowy

Spis treści

1 Bufor głębokości i bufor szablonowy

2 Bufor głębokości (depth buffer)

3 Bufor szablonowy (stencil buffer)

4 Odbicie zwierciadlane

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 25 / 34

Page 26: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Zmodyfikujmy nieco nasz sześcian dodając czarną podłogę, wktórej odbija się nasz sześcian.Na początek dodamy współrzędne wierzchołków wyznaczającychkwadrat podłogi do istniejącego bufora wierzchołków.

float vertices[] = {...-1.0f, -1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,1.0f, -1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,1.0f, 1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,1.0f, 1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,

-1.0f, 1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,-1.0f, -1.0f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f

}

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 26 / 34

Page 27: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Teraz należy dodać ddodatkowe wywołanie funkcji rysującej dopętli zdarzeń:

glDrawArrays(GL_TRIANGLES, 36, 6);

Aby utworzyć odbicie sześcianu, wystarczy go przemieścić iodwrócić względem płaszczyzny z = 0.Uzyskamy to modyfikując macierz modelu i przekazując jąshaderowi wierzchołków jako uniform :

model = glm::scale(glm::translate(model,glm::vec3(0, 0, -1)), glm::vec3(1, 1, -1));

glUniformMatrix4fv(uniModel, 1, GL_FALSE,glm::value_ptr(model));

glDrawArrays(GL_TRIANGLES, 0, 36);

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 27 / 34

Page 28: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Efekt obu opracji po niewielkiej zmianie pozycji kamery jestnastepujący:

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 28 / 34

Page 29: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

W renderowanym obrazie uwidaczniają się dwa problemy:podłoga maskuje część sześcianu jako wynik testu głębokościfragmentów,obraz przyszłego odbicia pojawia się poza obszarem podłogi.

Pierwszy problem jest łatwy do rozwiązania poprzez tymczasowewyłączenie zapisu do bufora głębokości podczas rysowaniapodłogi:

glDepthMask(GL_FALSE);glDrawArrays(GL_TRIANGLES, 36, 6);glDepthMask(GL_TRUE);

Aby rozwiązać drugi problem, konieczne jest odrzuceniefragmentów, które wychodzą poza podłogę.Nadszedł czas, aby sprawdzić, co jest warte testowanie buforaszablonu.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 29 / 34

Page 30: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Teraz może się okazać korzystne utworzenie niewielkiej listyzadań - etapów renderowania sceny, aby uzyskać pełny wgląd wto co się ma wydarzyć.

narysuj podstawowy sześcian,włącz testowanie bufora szablonowego, ustaw funkcjęszablonową i operacje tak, aby zapisać wartość 1 do tychelementów bufora szablonowego, które przejdą pomyślnie obatesty, nie zmieniając przy tym bufora głębokości.narysuj podłogę,ustaw ponownie funkcję szablonową tak, aby test buforaszablonowego się powiódł, jeśli wartość szablonu wynosi 1 -tym razem nie zapisuj nic do bufora szablonowego, ale zmieniajwartości bufora głębokości,narysuj odwrócony sześcian,wyłącz test bufora szablonowego.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 30 / 34

Page 31: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Nowo dodany fragment kodu powinien wyglądać tak:

glEnable(GL_STENCIL_TEST);

// Rysowanie podłogi i wypełnianie bufora szablonowegoglStencilFunc(GL_ALWAYS, 1, 0xFF); // Zawsze zapisuj 1

// do bufora szablonowegoglStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);glStencilMask(0xFF); // Zapisuj do bufora szablonowegoglDepthMask(GL_FALSE); // Nie pisz nic w buforze głębokościglClear(GL_STENCIL_BUFFER_BIT); // Wyczyść bufor szablonowy

// (domyślnymi wartościami 0)

glDrawArrays(GL_TRIANGLES, 36, 6); // Narysuj podłogę

// Rysowanie odbicia sześcianuglStencilFunc(GL_EQUAL, 1, 0xFF); // Test szblonowy będzie

// pomyślny dla wartości 1

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 31 / 34

Page 32: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

glStencilMask(0x00); // Nie pisz nic w buforze// szablonowym

glDepthMask(GL_TRUE); // Zapisuj do bufora głębokości

model = glm::scale(glm::translate(model, glm::vec3(0, 0, -1)),glm::vec3(1, 1, -1) );

glUniformMatrix4fv(uniModel, 1, GL_FALSE,glm::value_ptr(model));

glDrawArrays(GL_TRIANGLES, 0, 36);

glDisable(GL_STENCIL_TEST);

Teraz należy tylko przyciemnić odbijającą się kostkę, abypodłoga nie wyglądała jak doskonałe lustro.

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 32 / 34

Page 33: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Możliwe jest to przy użyciu wektora typu uniform o nazwieoverrideColor w shaderze wierzchołków:

uniform vec3 overrideColor;...Color = overrideColor * color;

Należy również dokonać zmian w kodzie programu rysującego:

glUniform3f(uniColor, 0.3f, 0.3f, 0.3f);glDrawArrays(GL_TRIANGLES, 0, 36);glUniform3f(uniColor, 1.0f, 1.0f, 1.0f);

gdzie uniColor jest zwracanym przez funkcjęglGetUniformLocation uchwytem wektora overrideColor .

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 33 / 34

Page 34: OpenGL - Bufor g ebokosci i bufor szablonowy

Odbicie zwierciadlane

Ostateczny efekt działania programu jest nastepujący:

Mirosław Głowacki (AGH, UJK) OpenGL 2017-2022 34 / 34