Co to są pochodne miejsca na ekranie i kiedy ich używać?

12

Widzę funkcje ddxi ddyglsl i odpowiedniki hlsl pojawiają się w kodzie modułu cieniującego co jakiś czas. Obecnie używam ich do mapowania wypukłości bez stycznej lub bitangentu, ale w zasadzie skopiowałem i wkleiłem kod. Nie rozumiem, czym właściwie są te funkcje, co robią i kiedy chciałbym ich użyć.

Więc pytania:

  1. Jakie są funkcje pochodne obszaru ekranu?
  2. Czym zajmują się te funkcje? Wartości wejściowe i wyjściowe
  3. Do jakich efektów są najczęściej używane?
  4. Jakie efekty wymagają spojrzenia na te funkcje?
NeomerArcana
źródło
W przeszłości używałem ich do wypaczania tekstur, gdzie wypaczanie może powodować wybranie niewłaściwego poziomu miplevel dla niektórych fragmentów; zazwyczaj niższy poziom wielopoziomowy, dzięki czemu można było bardzo wyraźnie zmienić teksturę podczas wypaczania. Pobranie pochodnych niepoprawnych teksturków, następnie obliczenie wypaczenia, a następnie użycie tex2Dgrad / SampleGrad / textureGrad z wypaczonymi teksturkami i pochodnymi zapobiega temu.
Maximus Minimus
@ LeComteduMerde-fou jakie są wypaczenia tekstury? Szybkie Google sugeruje, że masz na myśli zawijanie?
NeomerArcana
Nie, mam na myśli osnowy , czyli zniekształcenia tekstury poprzez zmianę coords tekstur w czasie.
Maximus Minimus
Zobacz to powiązane pytanie . Nie wydaje mi się, żeby było to dość duplikat, ponieważ w połączonym pytaniu pytamy więcej o to, jak działają te funkcje / jak są one obliczane, zamiast wyższego poziomu „co to jest i do czego służy?”
DMGregory
Cześć, jestem bardzo zainteresowany tym , obecnie używam ich do mapowania nierówności bez stycznej lub bitangentu, ale w zasadzie skopiowałem kod. ... myślałem o użyciu go do tego ... ale nie wiem, jak przekształcić te pochodne przestrzeni ekranowej w normalne czasoprzestrzenie za pomocą taniej algebry liniowej. Być może potrzebuję odwrotności matrycy projekcyjnej kamery.
Prokop Hapala

Odpowiedzi:

12

Po pierwsze, pomaga wiedzieć, że procesory graficzne zawsze oceniają shadery fragmentów / pikseli na 2x2 blokach pikseli jednocześnie. (Nawet jeśli ostatecznie trzeba narysować tylko niektóre z tych pikseli, inne znajdują się poza wielokątem lub są zasłonięte - niepotrzebne fragmenty są maskowane, a nie zapisywane na końcu).

Schemat ilustrujący pochodne w zrasteryzowanym trójkącie

Pochodna przestrzeni ekranowej zmiennej (lub wyrażenia) vw twoim module cieniującym jest różnicą wartości v(w tym punkcie kodu) z jednej strony tego kwadratu 2x2 pikseli na drugą. to znaczy. ddxjest wartością vw prawym pikselu pomniejszoną o wartość vw lewym i podobnie dla ddypionu.

To odpowiada „jak szybko vrośnie lub maleje, gdy poruszamy się w poziomie (ddx) lub pionowo (ddy) po ekranie?” - tj. w kategoriach rachunku przybliża częściowe pochodne twojej zmiennej (przybliżone, ponieważ wykorzystuje dyskretne próbki na każdym fragmencie, zamiast matematycznie oceniać nieskończenie małe zachowanie funkcji)

W przypadku wielkości skalarnych możemy to również postrzegać jako wektor gradientowy, ∇v = float2(ddx(v), ddy(v)) który wskazuje wzdłuż kierunku przestrzeni ekranu, w którym vrośnie najszybciej.

Ten rodzaj informacji jest często wykorzystywany wewnętrznie do wyboru odpowiedniej mipmapy lub anizotropowego jądra filtrującego do wyszukiwania tekstur. Na przykład, jeśli mój aparat wygląda prawie równolegle do pionowego uvkierunku teksturowanej płaszczyzny podłogi, ddy(uv.y)będzie bardzo duży w porównaniu do ddx(uv.x)(ponieważ oś pionowa jest wstępnie skrócona na ekranie - jeden piksel w pionie pokrywa dłuższy odcinek przestrzeni tekstury), co mówi sprzętowi do próbkowania tekstury, że potrzebuję filtrowania anizotropowego, aby rozmazać pionowy kierunek tekstury bardziej niż poziomy, aby uniknąć artefaktów aliasingu.

W przypadku najprostszych efektów nie musisz używać tych pochodnych, ponieważ podstawowe metody próbkowania tekstur 2D obsługują je za Ciebie. Ale jak wspomniała Le Comte du Merde-fou w powyższym komentarzu, podczas zniekształcania wyszukiwań tekstur konieczne może być ręczne pobranie i / lub masowanie pochodnych przestrzeni ekranu, aby pomóc sprzętowi wybrać odpowiednie filtrowanie (np. Poprzez tex2Dlodw HLSL)

Kalkomanie przestrzeni ekranu są jednym z takich przypadków, w których pojedynczy blok 2x2 może pokryć dużą nieciągłość skoku w obliczonej współrzędnej tekstury, co prowadzi do rozmazania lub aliasu krawędzi, jeśli system naiwnie obliczy poziom filtrowania. W tym artykule szczegółowo opisano ten artefakt i przedstawiono sposoby jego złagodzenia .

Te pochodne mogą być również przydatne, gdy używasz funkcji szumu w proceduralnym generowaniu tekstur. Jeśli powiedzmy, że chcesz przekształcić szum proceduralny w normalną mapę, ddx i ddy podają prosty, choć przybliżony sposób, aby obliczyć, jak zmienia się wartość hałasu w pobliżu bieżącego fragmentu i w jaki sposób jest nachylony, więc potrafi skonstruować odpowiednią normalną.

Techniki renderowania wygładzonych linii lub podświetlenia skrzyżowań mogą również wykorzystywać pochodne przestrzeni ekranu, aby zapewnić spójność grubości / opadania i nie zależą od geometrii ani kąta widzenia.

W tym przemówieniu na temat renderowania piasku w Journey mówca wspomniał, że mogliby użyć tych funkcji pochodnych do kontrolowania, jak iskrzący jest piasek wzdłuż zerkających krawędzi ... gdyby o tym wiedzieli (zamiast tego zastosowali sztuczkę mipmapy, które i tak pod maską są zasilane tego rodzaju pochodnymi)

Ostatnia uwaga, o której należy pamiętać: pochodne obszaru ekranu można obliczyć z „grubą” / niską precyzją (co oznacza, że ​​jedna para pochodnych jest wspólna dla całego kwadratu) lub „drobną” / wysoką precyzją (co oznacza, że ​​każdy piksel jest porównywany tylko z jego bezpośrednim sąsiedzi w kwadrze, co może dać cztery odrębne pary pochodnych w kwadracie). Z grubsza jest na ogół dużo, ale jeśli zauważysz, że w efekcie widać 2 x 2 bloki, to dobra wskazówka, którą chcesz przełączyć na dokładność wysoką / wysoką. ;)

(Na schemacie u góry użyłem obliczeń dla drobnych instrumentów pochodnych, ale uważaj, że same ddx / ddy mogą same domyślnie przyjmować grubsze pochodne)

DMGregory
źródło
Kiedy mówisz, że jest to różnica między pikselami z jednej strony bloku 2x2 na drugą, to czy jest to różnica w wartości pikseli, czy różnica w pozycji texela? Jeśli jest to różnica w wartości, to czy sumuje tekstury pomiędzy nimi czy coś?
NeomerArcana
Jest to różnica w wartości argumentu ( vtutaj), a ponieważ jest to quad 2x2, nie ma między nimi żadnych pikseli. Jeśli więc cieniujemy lewy górny fragment kwadratu, a v = 1 tam, a w prawym górnym fragmencie v = 4, to ddx (v) = 3 (mówiąc: „v wzrasta o 3 podczas ruchu od lewej do prawej ”)
DMGregory
Nadal nie do końca rozumiem. Jeśli patrzę pod kątem, blok 2x2 może nie składać się z pikseli obok siebie w teksturze. Więc różnica wartości, czy różnica między dwoma wybranymi teksturami, czy różnica między dwoma wybranymi teksturami, biorąc pod uwagę te pominięte?
NeomerArcana
Zapomnij o teksturach - nie próbkuje tekstury. Bierze dosłowną wartość argumentu przekazanego do ddx lub ddy i porównuje ją z wartością przekazaną do ddx lub ddy podczas oceny sąsiedniego fragmentu. Jeśli ta wartość pochodzi od próbki tekstury, niech tak będzie, ale funkcje pochodne nie mają żadnej wiedzy o teksturach. Po prostu odejmują liczby. Spróbuję dodać diagram do tej odpowiedzi, gdy wrócę do komputera.
DMGregory
Och, chyba teraz rozumiem. Byłoby świetnie uzyskać schemat, ale myślę, że rozumiem. Wyglądają na bardzo przydatne funkcje.
NeomerArcana