W jaki sposób filtrowanie anizotropowe jest zwykle realizowane w nowoczesnych procesorach graficznych?

14

Filtrowanie anizotropowe „zachowuje ostrość tekstury normalnie traconej przez próby tekstury mapy MIP w celu uniknięcia aliasingu”. Artykuł w Wikipedii zawiera wskazówki na temat tego, jak można go zaimplementować („zbadać teksturę (...) dla dowolnej orientacji anizotropii”), ale nie jest to dla mnie zbyt jasne.

Wydaje się, że istnieją różne implementacje, jak sugerują testy zilustrowane w notatkach z prezentacji Przybliżone modele dla fizycznego renderowania : wprowadź opis zdjęcia tutaj

Jakie są konkretne obliczenia wykonywane przez (nowoczesne) układy GPU, aby wybrać prawidłowy poziom MIP podczas korzystania z filtrowania anizotropowego?

wycierać
źródło
3
Specyfikacja GL_EXT_texture_filter_anisotropicjest bardzo szczegółowa. Może to pomoże ci lepiej zrozumieć proces.
glampert

Odpowiedzi:

14

Sprzęt do filtrowania tekstur pobiera kilka próbek o różnych poziomach mipmapy (maksymalna ilość próbek jest wskazywana przez anizotropowy poziom filtrowania, chociaż dokładna ilość próbek pobranych w danej operacji filtrowania będzie zależeć od proporcji między pochodnymi na fragmencie. ) Jeśli rzutujesz stożek patrząc na powierzchnię pod kątem ukośnym na przestrzeń tekstury, spowoduje to w przybliżeniu owalny rzut, który jest bardziej wydłużony dla bardziej ukośnych kątów. Dodatkowe próbki są pobierane wzdłuż osi tego owalu (z prawidłowych poziomów mip, aby skorzystać z oferowanego przez nie wstępnego filtrowania) i łączone w celu uzyskania ostrzejszej próbki tekstury.

Inna technika znana jako mapowanie rip (wspomniana w artykule Wikipedii o Mipmapping), która nie jestpowszechnie spotykane we współczesnych układach GPU, wykorzystuje wstępne filtrowanie tekstur. W przeciwieństwie do mipsów, tekstura nie jest zmniejszana równomiernie, ale przy użyciu różnych proporcji wysokości do szerokości (do proporcji zależnej od wybranego poziomu filtrowania anizotropowego). Następnie wybiera się wariant - a może dwa warianty, jeśli stosuje się filtrowanie trójliniowe - na podstawie kąta powierzchni, aby zminimalizować zniekształcenie. Wartości pikseli są pobierane przy użyciu domyślnych technik filtrowania (dwuliniowe lub trójliniowe). Rip-mapy nie są używane w żadnym znanym mi sprzęcie ze względu na ich zaporowy rozmiar: podczas gdy mipmapy zajmują dodatkowe 33% pamięci, ripmapy używają 300%. Można to zweryfikować, zauważając, że wymagania dotyczące używania tekstur nie rosną podczas korzystania z AF, a jedynie szerokość pasma.

W celu dalszego czytania warto zapoznać się ze specyfikacją rozszerzenia OpenT EXT_texture_filter_anisotropic . Wyszczególnia formuły stosowane do obliczania próbek i sposób ich łączenia podczas korzystania z filtrowania anizotropowego.

yuriks
źródło
5
Mapy RIP również prawdopodobnie nie są używane, ponieważ nie pomagają w dość powszechnym przypadku przekątnych. FWIW, jeśli możesz znaleźć kod dla Microsoft Refrast, implementacja filtra anistropowego w tym prawdopodobnie jest dobrym odniesieniem do tego, jak robi to dzisiejszy sprzęt.
Simon F
1
„Można to zweryfikować, zauważając, że wymagania dotyczące używania tekstur nie rosną podczas korzystania z AF, a jedynie szerokość pasma”. Argument zabójcy. Dobra odpowiedź!
David Kuri
Łącze „Wydajna rasteryzacja oprogramowania na układach GPU” tylko raz wspomina o filtrowaniu anizotropowym i nie wspomina o żadnych szczegółach. Więc wyedytuję to z odpowiedzi, ponieważ nie sądzę, żeby było to przydatne w pomocny sposób.
yuriks,
@ SimonF również możemy dodać, że dodatkowe wymagania dotyczące przepustowości są dość przerażające.
v.oddou
9

Wymagania API można znaleźć w dowolnej specyfikacji lub rozszerzeniach. Oto jeden: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Wszyscy dostawcy GPU prawdopodobnie odbiegają od specyfikacji, ponieważ jakość AF była częścią wielu testów porównawczych. Obecne wdrożenia będą nadal ewoluować, ponieważ nowe obciążenia podkreślają istniejące przybliżenia. Niestety, aby dokładnie wiedzieć, co się dzieje, musisz być częścią jednej z firm. Ale możesz zmierzyć spektrum możliwości z następujących dokumentów, wymienionych w kolejności rosnącej jakości i kosztów wdrożenia:

Cytowanie ze specyfikacji:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
ap_
źródło