Jaki jest cel glScissor?


32

Wiem, że jest bardziej wydajny niż test matrycowy, ale czy mam rację, zakładając, że tę samą funkcjonalność można uzyskać za pomocą transformacji rzutowania z rzutnią?

Odpowiedzi:


46

Są bardziej komplementarne niż alternatywy dla siebie. Prawie zawsze chcesz ustawić prostokąt nożycowy na takie same wartości jak rzutnia.

glViewport () określa transformację ze znormalizowanej przestrzeni projekcyjnej na przestrzeń ekranową. Wieloboki są przycinane do krawędzi przestrzeni projekcyjnej, ale inne operacje rysowania, takie jak glClear (), nie są. Tak więc używasz glViewport (), aby określić lokalizację i rozmiar obszaru rzutni obszaru ekranu, ale rasterizer nadal może czasami renderować piksele poza tym obszarem.

W tym momencie wchodzi nożyca. GlScissor () definiuje prostokąt przestrzeni ekranu, poza którym nic nie jest rysowane (jeśli włączony jest test nożyc).

Na przykład poniższy kod wyczyści cały ekran, nawet jeśli rzutnia jest ustawiona na małą część większego okna:

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

Dodanie glScissor () i włączenie testu nożycowego (który jest domyślnie wyłączony) ogranicza czyszczenie.

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

Czasami można natknąć się na implementację, która automatycznie nożyce do regionu rzutni, ale narusza specyfikację GL.

Poza tym prostokąt nożycowy może służyć do tymczasowego ograniczenia rysowania do pod-prostokątu rzutni, w celu uzyskania efektów specjalnych, elementów interfejsu użytkownika itp.


11
aby być bardziej przejrzystym, Viewportwycina obliczenia wierzchołków. Jeśli narysujesz linię o grubości> 1 lub punkt o gl_PointSize> 1, narysujesz również poza rzutnią.
gman

13

Działają w dwóch całkowicie różnych częściach potoku graficznego.

glViewport faktycznie określa transformację i jest to transformacja, która ma miejsce po module cieniującym wierzchołki, ale przed modułem cieniującym fragmenty. Jeśli pomaga zobaczyć, gdzie mieści się koncepcyjnie, pomyśl o tym, że jest częścią transformacji, które są używane do przenoszenia twoich danych wierzchołków z przestrzeni świata na przestrzeń ekranu (tj. Jest to stosunkowo blisko związane z widokiem modelu i rzutowaniem).

Test nożycowy ma miejsce po shaderze fragmentów, wraz ze wszystkimi innymi operacjami dla fragmentów, które mają miejsce w tym czasie, takimi jak mieszanie, głębokość / matryca itp. Kiedy fragment jest testowany za pomocą testu nożycowego, został już wykonany transformacja rzutni.

Tak, test nożycowy może być szybszy niż szablon, ponieważ jest to proste akceptowanie / odrzucanie na podstawie współrzędnych obszaru ekranu fragmentu, podczas gdy szablon musi być porównywany z bieżącą wartością w buforze szablonu, ewentualnie zwiększając lub zmniejszając tę ​​bieżącą wartość, należy również wziąć pod uwagę wyniki testu głębokości i tak dalej.

Podsumowując, możesz zobaczyć, dlaczego istnieje test nożycowy. Daje to możliwość ograniczenia operacji dla poszczególnych fragmentów do prostokątnej części ekranu, ale bez modyfikowania bieżącej transformacji rzutni.


6

Lubię tego rodzaju wyjaśnienia wizualne.

W OnpenGL mamy współrzędne 2D, które przechodzą od -1 do +1 zarówno dla osi X, jak i Y.

wprowadź opis zdjęcia tutaj

Następnie ten obraz musi zostać odwzorowany na współrzędne okna.

Wyobraźmy sobie, że mamy okno, które ma ciemny kolor jako tło, i mamy biel jako przezroczysty kolor.

Najczęstszym przypadkiem jest posiadanie okienka ekranu i nożyczek na całym ekranie.

wprowadź opis zdjęcia tutaj

Ale możemy ustawić je jako mniejszy obszar ekranu.

wprowadź opis zdjęcia tutaj

Regiony te mogą być różne. W poniższym przykładzie rzutnia obejmuje cały ekran, podczas gdy nożycą jest mniejsze pole.

wprowadź opis zdjęcia tutaj

I w tym ostatnim przypadku nożyca pokrywa cały ekran, a okienko to mniejsze okno. Zauważ, że glClearwpływa to na cały ekran, ponieważ zależy to od regionu nożycowego.

wprowadź opis zdjęcia tutaj


1
To jest dla mnie najwyraźniejsze wytłumaczenie, naprawdę potrzebne były rysunki.
Laurent Caillette

5

glScissors wykonuje obcinanie geometrii względem części ekranu.

Chciałbyś tego, na przykład, jeśli renderowałeś okno GUI z płynnie przewijanym tekstem. Chcesz wyciąć całą geometrię poza część ekranu objętą przez GUI, ale zachowaj częściowy tekst lub wielokąty, które są nadal w środku.

glViewport mapuje współrzędne projekcji na współrzędne urządzenia, ale nie przycina.

glStencil służy do maskowania pojedynczych pikseli w bardziej złożonych wzorach, takich jak nieregularne kształty. W ten sposób glScissors jest szybszy.


1

glScissor jest prostszy niż transformacja projekcji za pomocą okienka ekranu.

Test glScissor określa, które piksele należy zmienić podczas renderowania, natomiast glViewport zmienia sposób mapowania gl ze współrzędnych urządzenia na współrzędne okna.

Jaka jest różnica z ustawieniem rzutni na prostokąt, który chcesz wyrenderować i dopasowaniem macierzy projekcji, aby cofnąć skalowanie wykonane przez rzutnię.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.