Czwartorzędy (czterowymiarowe rozszerzenie liczb zespolonych) można wykorzystać do przedstawienia obrotu i skalowania wektora 3D, a zastosowanie czwartorzędu na wektorze 3D wymaga dwóch multiplikacji czwartorzędowych, a zatem wymaga mniejszej liczby operacji niż pomnożenie przez odpowiednią macierz transformacji. Jednak często stosowane są macierze transformacji liniowej i afinicznej, szczególnie w kodzie shadera.
Kiedy jest właściwe i preferowane (ze względu na prędkość, stabilność itp.) Użycie ćwiartki do reprezentowania skalowania i obrotu w trzech wymiarach zamiast odpowiedniej macierzy transformacji?
transformations
es1024
źródło
źródło
Odpowiedzi:
Chcę zacząć od nieporozumień:
Nowoczesne procesory graficzne (NVIDIA od dłuższego czasu i AMD od Wysp Południowych) nie wspierają znacząco operacji wektorowych / macierzowych natywnie w sprzęcie. Są to architektury wektorowe w innym kierunku: każdy element wektora (x, y, z) ma zazwyczaj wartość 32 lub 64, zawierającą wartości dla każdego elementu na linii. Tak więc iloczyn 3D nie jest zwykle instrukcją, jest pomnożeniem i dwoma pomnożeniami.
Ponadto zliczanie prymitywnych operacji, takich jak wielokrotne dodawanie, transformacja wektora przez czwartorzęd jest droższa niż transformacja wektora za pomocą macierzy. Przekształcanie wektora za pomocą macierzy 3x3 to 3-krotność i 6-krotność dodawania, a przekształcanie wektora przez ćwiartkę to dwa mnożniki czwartorzędowe, z których każdy składa się z 4 mnożeń i 12 mnożeń. (Możesz być mniej naiwny niż ten - tutaj jest szybszy zapis - ale wciąż nie jest tak tani jak pomnożenie wektora przez macierz).
Jednak wydajność nie zawsze jest określana po prostu przez zliczenie liczby operacji ALU, które wykonuje. Czwartorzędy wymagają mniej miejsca niż odpowiednik macierzy (zakładając, że wykonujesz tylko obrót / skalowanie), a to oznacza mniej miejsca na dysku i mniejszy ruch pamięci. Jest to często ważne w animacji (co dogodnie jest często również tam, gdzie pojawiają się ładne właściwości interpolacji czwartorzędów).
Inne niż to:
źródło
DP3
instrukcji Intel Haswell GPU instrukcja ARBfp wydaje się zaimplementowana jako 3 zwielokrotnienia i 2 dodatki, patrzINTEL_DEBUG=fs
dane wyjściowe sterownika Intel Linux: paste.ubuntu.com/23150494 . Nie jestem pewien, czy to po prostu słaby sterownik, czy HW naprawdę nie ma specjalnych instrukcji dla wielu wektorów.(Wiele informacji tutaj bezwstydnie pożyczyłem od odpowiedzi joojai i maniaka grzechotki, z kilkoma własnymi notatkami.)
Zalety matrycy
Zalety czwartorzędu
Jeśli wiesz, że będziesz robił tylko jednolite transformacje sztywnego ciała, para wektor / quat jest zwykle solidną wygraną na macierzy 3x4 pod względem miejsca do przechowywania (wektor / quat: 7 lub 8 liczb zmiennoprzecinkowych w porównaniu do liczb zmiennoprzecinkowych mat3x4: 12) i szybkość przetwarzania. Jeśli Quaternions nadal są dla ciebie mistycznym voodoo, wypróbuj na nich tę serię internetową .
źródło
Macierze oferują więcej możliwych transformacji niż ćwiartki, możliwe jest pochylenie, odbicie lustrzane i nierównomierne skalowanie matrycy. Nic nie wskazuje na to, że nie można zmusić silnika do wykonywania tylko transformacji na podstawie czwartorzędu, jeśli nie są potrzebne dodatkowe funkcje transformacji.
Macierze są bardzo wygodne, gdy trzeba budować przestrzenie, w których znamy wektory podstawowe. Na przykład podczas projekcji na ortografię. Łatwe jest także przekształcanie perspektywy w przestrzeni macierzy. Matryce są lepsze, jeśli chodzi o wyświetlanie rzeczy.
W pewien sposób zwykle stosuje się macierze, ponieważ reprezentują one najczęstsze nazwy i nie są zbyt skomplikowane, aby je opanować i zrozumieć. Korzyści ze standaryzacji znacznie przewyższają korzyści wynikające z niestandardowego przepływu pracy. Dobrze wiadomo, jak wykonywać operacje na macierzach. Podczas gdy quaty nie są czymś najbardziej natychmiastowym wprowadzanym w uni. Zapytaj tylko, ilu umie umieć odwrócić kwaternion, podczas gdy nie znajdziesz wielu studentów wyższych uczelni, którzy nie wiedzą, jak odwrócić macierz.
Pamiętaj, że karty graficzne mają również dedykowane potoki do operacji matrycowych.
źródło
Czwórnik może reprezentować tylko jednolite skalowanie i obrót, więc jeśli potrzebujesz czegoś innego, musisz dodać coś, co to reprezentuje.
Tłumaczenie można wykonać za pomocą jednego dodatkowego vec3 (lub przy użyciu podwójnych czwartorzędów ). Jednak nierównomierne skalowanie i sheering jest lepiej reprezentowane przez mat4. Transformacje rzutowania (zasadniczo nierównomierne skalowanie i zamiana z i w) nie mogą być reprezentowane przez ćwiartkę.
Czwartorzędy mają dużą przewagę podczas interpolacji. Slerp najłatwiej jest obliczyć za pomocą czwartorzędów.
Zastosowanie czwartorzędu (lub podwójnego czwartorzędu) nie jest wbudowane w procesor graficzny, więc trzeba je zaimplementować za pomocą operacji wektorowych. Większość bibliotek czwartorzędowych zakłada, że nie będziesz używać czwartorzędu do reprezentowania skali, więc na to należy zwrócić uwagę.
źródło