Moje pytanie dotyczy konkretnie Metalu, ponieważ nie wiem, czy odpowiedź zmieni się dla innego API.
Do tej pory rozumiem, że:
Tekstura zmapowana ma wstępnie obliczone „poziomy szczegółowości”, w których niższe poziomy szczegółowości są tworzone przez próbkowanie w dół oryginalnej tekstury w jakiś znaczący sposób.
Poziomy mipmap są określane w malejącym poziomie szczegółowości, gdzie poziom
0
jest oryginalną teksturą, a wyższe poziomy są potęgą dwóch jego redukcji.Większość procesorów graficznych implementuje filtrowanie trójliniowe, które wybiera dwa sąsiednie poziomy mipmapy dla każdej próbki, próbki z każdego poziomu za pomocą filtrowania dwuliniowego, a następnie liniowo miesza te próbki.
Nie do końca rozumiem, jak wybierane są te poziomy mipmap. W dokumentacji standardowej biblioteki Metal widzę, że można pobierać próbki z określeniem instancji lod_options
typu lub bez niego . Zakładam, że ten argument zmienia sposób wyboru poziomów mipmap i istnieją najwyraźniej trzy rodzaje lod_options
tekstur 2D:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Niestety dokumentacja nie przeszkadza w wyjaśnieniu, co robi dowolna z tych opcji. Mogę zgadywać, że bias()
wpływa to na pewien automatycznie wybrany poziom szczegółowości, ale co to value
znaczy błąd? Na jakiej skali działa? Podobnie jak jest lod
w level()
języku dyskretnych poziomów mipmapa? I, działając przy założeniu, że gradient2d()
wykorzystuje gradient współrzędnej tekstury, w jaki sposób używa tego gradientu, aby wybrać poziom mipmapy?
Co ważniejsze, jeśli pominie się lod_options
, w jaki sposób wybierane są poziomy mipmap? Czy różni się to w zależności od rodzaju wykonywanej funkcji?
A jeśli domyślną operacją sample()
funkcji nieokreśloną w opcjach jest wykonanie czegoś takiego gradient2D()
(przynajmniej w module cieniującym fragmenty), czy wykorzystuje ona proste pochodne przestrzeni ekranu, czy też działa bezpośrednio z rasterizerem i interpolowanymi współrzędnymi tekstury obliczyć dokładny gradient?
I w końcu, jak spójne jest to zachowanie w zależności od urządzenia? Stary artykuł (stary jak w DirectX 9), który przeczytałem, dotyczył złożonego wyboru mipmap specyficznych dla urządzenia, ale nie wiem, czy wybór mipmap jest lepiej zdefiniowany w nowszych architekturach.