Jaki jest cel objętości kanonicznej?

15

Obecnie uczę się OpenGL i nie mogłem znaleźć odpowiedzi na to pytanie.

Po zastosowaniu macierzy rzutowania do przestrzeni widokowej przestrzeń widokowa jest „znormalizowana”, tak aby wszystkie punkty znajdowały się w zakresie [-1, 1]. Jest to ogólnie nazywane „objętością widoku kanonicznego” lub „znormalizowanymi współrzędnymi urządzenia”.

Chociaż znalazłem wiele zasobów mówiących o tym, jak to się dzieje, nie widziałem nic o tym, dlaczego tak się dzieje.

Jaki jest cel tego kroku?

breadjesus
źródło

Odpowiedzi:

7

Najważniejsze jest to, że konwertuje twoje punkty (wierzchołki) z przestrzeni świata 3D na przestrzeń ekranu 2D.

Oznacza to, że po pomnożeniu wierzchołka przez tę macierz, współrzędne X i Y są pozycjonowane na ekranie (między [-1, 1]), a Z jest głębokością. Z służy do buforowania głębokości i określa, jak daleko wierzchołek (lub fragment) znajduje się od twoich kamer w pobliżu płaszczyzny.

Projekcja oznacza, że ​​wierzchołki, które są bliżej od bliskiej płaszczyzny, są bardziej oddalone od środka ekranu -> trójkąt bliżej kamery wydaje się większy niż ten, który jest daleko. A to zależy od twojego pola widzenia - wpisujesz je w funkcji createProjectionMatrix lub createFrustum. Działa, ponieważ tnie i skaluje fragment aparatu i wierzchołki w nim do kostki jednostkowej. Wartości większe niż 1 i mniejsze niż -1 nie są wyświetlane.

Utrzymuje również proporcje pikseli, więc piksel może być kwadratowy. To jest proste. Po prostu wycina fragment aparatu w ten sposób: szerszy ekran -> więcej pionowego ścinania i odwrotnie.

Prosta odpowiedź:
określa frustum aparatu i dobrze:

  • sprawi, że obiekty, które są blisko ciebie, będą większe niż obiekty, które są daleko od ciebie.
  • zachowaj proporcje pikseli - Każdy lubi kwadratowy piksel, prawda? :)
Notabene
źródło
Nie widzę żadnej części, w której zapytałby, co robi matryca projekcji. Wydaje się po prostu zastanawiać, do czego służą znormalizowane współrzędne urządzenia.
Chris mówi Przywróć Monikę
Macierz projekcji wyznacza bryły aparatu. Ale to nie wyjaśnia powodu, dla którego [-1,1] jest kanoniczną głośnością oglądania. Dlaczego zamiast tego nie ma [-100,100]?
bobobobo
1
ponieważ 1 to „częstsza liczba” niż 100: D (0 jest jeszcze częstsze, ale kostka 0x0x0 nie jest zbyt interesująca ...)
Ivan Kuckir
5

Ta odpowiedź jest długo po fakcie, ale ponieważ znalazłem to w google, może to jeszcze komuś pomoże. Chcę tylko wyjaśnić, co mówili JasonD i Notabene: O wiele łatwiej jest wykonywać obliczenia obcinania (dowiedz się, co powinieneś zobaczyć, a czego nie powinieneś widzieć z powodu tego, w jaki sposób patrzysz, jak daleko jest, itp. .). Zamiast sprawdzać, czy rzeczy przecinają płaszczyzny na obrzeżach fragmentu widoku, po prostu porównujesz x, y, z wszystkiego do xMax, xMin, yMax itp. , ponieważ masz po prostu sześcian. Jest to trochę bardziej skomplikowane, jeśli chcesz mieć tylko część czegoś do pokazania, ale matematyka jest nadal lepsza z kostką jednostkową niż z frustum.

Kilka rzeczy, które wprowadziłem w błąd w innych odpowiedziach:

-Nie ścinasz boków od frustum widoku, w pewnym sensie wypaczasz go w sześcian przy użyciu homogenicznych przekształceń macierzy.

- W tym kroku nie konwertujemy do ekranu 2D. Ten krok nie jest konieczny do tego. Teoretycznie moglibyśmy wykonać całą naszą pracę bez konwersji frustum na kostkę, co byłoby bardziej intuicyjne, ale trudniejsze matematyczne - ale grafika polega na wykonywaniu obliczeń naprawdę szybko, ponieważ w przypadku przeciętnej gry / czegokolwiek jest dużo obliczeń na sekundę.

Więcej szczegółów: Konwertujemy niekoniecznie sześcian jednostkowy, po prostu musi to być prostokątne pudełko, aby zadziałały nasze obliczenia maks. Min. W rzeczywistości w klasie użyliśmy ramki, w której kamera jest skierowana w dół względem osi Z, z wynosi od 0 do 1, x zmienia się od -1 do 1, a y zmienia się od -1 do 1. Ogólnie w matematyce 1, 0, a -1 to dobre liczby ułatwiające obliczenia, zakładam, że dlatego nie przechodzimy od -100 do 100 czy coś takiego.

TLDR: Ułatwia przycinanie.

Edycja: sedno ma bobobobo. Ogólnie wszystko jest trójkątami: D.

Źródło: Biorąc udział w grafice uniwersyteckiej

Brian
źródło
Choć interesujące, wydaje się, że twoje punkty są częściowo prawdziwe. Nie używasz macierzy jednorodnej, po prostu w przestrzeni klipu punkty są zdefiniowane w przestrzeni jednorodnej. 2) prawda, w klipach miejsca pontów nie są jeszcze wyświetlane na ekranie. Dzieje się tak po podziale perspektywy, choć należy pamiętać, że dzieje się tak koniecznie, gdy wrócisz z miejsca klipu do miejsca kartezjańskiego. 3) tak i nie. Konwersja współrzędnych punktów na przestrzeń NDC jest nadal w jakiś sposób konieczna. To, co nie jest konieczne, to przestrzeń klipu, która jest specyficzna dla GPU. ...
18490
... To etap przestrzeni klipu, który nie jest konieczny, a nie ponowne mapowanie do kostki jednostkowej. Twoje ostatnie założenie również jest nieprawidłowe. Zmieniasz mapę na -1 na 1, ponieważ łatwiej jest przejść z przestrzeni NDC do przestrzeni rastrowej (transformacja rzutni). Jest to nawet łatwiejsze, jeśli przestrzeń NDC jest w zakresie [0,1], co ma miejsce w przypadku niektórych implementacji. Na koniec wszystko jest matematyczne, więc na pewno można zastosować inne konwencje. zobacz dobrą stronę scratchapixel, aby uzyskać więcej informacji.
user18490
1

Uważam, że dzieje się tak, ponieważ OpenGL nie może przyjmować założeń dotyczących sposobu wyświetlania obrazu (proporcje lub rozdzielczość, szczegóły sprzętu itp.). Renderuje i obrazuje w formę pośrednią, którą system operacyjny lub sterownik lub cokolwiek skaluje do prawidłowej rozdzielczości / wielkości.

Chewy Gumball
źródło
Nie masz racji, gdy mówisz o szczegółach sprzętowych. Są nie. Również jeśli piszesz swój własny program rastarizator na procesorze (dlaczego to zrobić? Aby dowiedzieć się, jak to działa :)) używasz tych samych matryc, co na gpu. Masz szczęście, że nadal nie mam przywilejów, aby głosować w dół :)
Notabene
Czy nie musi znać współczynnika kształtu? Z tego, co rozumiem, przechowuje współczynniki skalowania dla X i Y, dzięki czemu obraz będzie miał później prawidłowe proporcje.
breadjesus
3
Popraw mnie, jeśli się mylę, ale on mówi o tym, kiedy projektujesz punkty, a zatem mówimy 2D. W takim przypadku OpenGL nie wie, gdzie na ekranie umieścisz ten obraz, ani o tym, jak zostanie wyświetlony. Tworzy obraz, który jest następnie łatwy do skalowania i prawidłowego umieszczenia, ale nie robi tego za Ciebie. Zgadzam się, że szczegóły sprzętu były złą nazwą, po prostu miałem na myśli powyższe. Możesz także określić matrycę projekcji o współczynniku kształtu, ale ten współczynnik nie musi być taki sam jak na monitorze.
Chewy Gumball,
3
Muszę powiedzieć, że ta rozmowa bardzo mi się podoba. Jesteś blisko mieć rację. Zejdźmy głębiej. Po pomnożeniu wierzchołków przez projMat nie ma obrazu. Wynik to tylko zestaw punktu 2D z głębokością. Rozpoczyna się rastaryzacja i powstają obrazy. (jeśli na jednostce centralnej rysuje linie między trójkątami wierzchołków i wypełnia ją (i przyciemnia ją cokolwiek) ... na gpu jest wykonywana tuż przed shaderem pikseli / fragmentów). A współczynnik proporcji umieszcza punkty, które powinny być „przeskalowane” do wartości większych niż 1 lub mniejszych niż -1 i nie będą wyświetlane.
Notabene,
2
AH! Widzę problem tutaj. Powiedział „Jest to ogólnie określane jako„ objętość widoku kanonicznego ”lub„ znormalizowane współrzędne urządzenia ”. Odpowiadałem, jakby pytał o znormalizowane współrzędne urządzenia, ale tak naprawdę wcale nie pytał o te współrzędne. W rzeczywistości są to dwie zupełnie różne rzeczy i dlatego tutaj jesteśmy w sprzeczności. Być może należy to wyjaśnić, aby ludzie nie popełnili tego samego błędu, co ja.
Chewy Gumball,
1

Zauważyłem, że odpowiedź została już zaakceptowana, ale generalnie przydatne do obcinania jest przekształcenie widoku frustum w kostkę jednostkową.

JasonD
źródło
To prawda, że ​​niewiele zredagowałem swoją odpowiedź, aby wyjaśnić to bardziej.
Notabene
Nawiasem mówiąc, sześcian jednostkowy jest sześcianem boku 1. Więc nazwa jest nieodpowiednia. Zamiast tego należy nazwać kanoniczną głośnością oglądania.
user18490
1

Zastanawiałem się także nad tym. Jest kilka rzeczy do rozważenia.

Po pierwsze, tak, wszystko na świecie przekształca się w tę kostkę jednostkową [-1,1] skupioną wokół źródła. Jeśli coś nie znajduje się w tej jednostce, to nie będzie wyświetlane.

Zaletą jest to, że teraz możesz dość łatwo wyrywać trójkąty. (Jeśli wszystkie 3 wierzchołki trójkąta mają x > 1lub x < -1wtedy trójkąt może zostać ubity).

Bobobobo
źródło
0

Poleciłbym sprawdzić lekcję o macierzy projekcji perspektywicznej na Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

Wyjaśnia to wyraźnie, dlaczego należy wypaczać przestrzeń w kształcie ściętego widoku do kostki jednostkowej. Dlaczego? Zasadniczo dlatego, że proces rzutowania punktów 3D na kanwie wymagał konwersji ich przestrzeni NDC, która jest przestrzenią, w której punkty na ekranie są odwzorowywane w zakresie [-1,1] (zakładając, że ekran jest kwadratowy). Teraz ponownie mapujemy współrzędną punktu Z do zakresu [0,1] (lub czasami [-1,1]), dlatego w końcu otrzymujemy sześcian. Faktem jest, że gdy punkty są zawarte w sześcianie, łatwiej jest je przetwarzać niż wtedy, gdy są zdefiniowane w widoku frustrum (co jest dziwną przestrzenią, ściętą piramidą). Innym powodem jest to, że w pewien sposób przenosi wszelkiego rodzaju transformację rzutową, jaką można sobie wyobrazić w CG w to samo miejsce (kostka jednostkowa). Niezależnie od tego, czy na przykład korzystasz z projekcji perspektywicznej czy ortograficznej,

Chociaż może zbytnio skupiasz się na tym, dlaczego. Sześcian jednostkowy jest tak naprawdę wynikiem procesu matematycznego lub wykorzystanego do rzutowania wierzchołków na ekran, a następnie odwzorowania ich współrzędnych na przestrzeń rastrową.

użytkownik18490
źródło