Jak działa mapowanie mip z teksturami innymi niż power-of-2?

12

Słyszałem, że wszystkie najnowsze procesory graficzne obsługują tekstury bez mocy 2 i wszystkie funkcje po prostu działają. Nie rozumiem jednak, w jaki sposób mapowanie mipów działałoby w takim scenariuszu. Czy ktoś może wyjaśnić?

ap_
źródło

Odpowiedzi:

13

Zasadą jest, że aby obliczyć następny rozmiar mipmapy, dzielisz przez dwa i zaokrąglasz w dół do najbliższej liczby całkowitej (chyba że zaokrągla ona w dół do 0, w takim przypadku jest to 1). Na przykład obraz 57x43 miałby mipmapy takie jak:

level 0: 57x43
level 1: 28x21
level 2: 14x10
level 3: 7x5
level 4: 3x2
level 5: 1x1

Mapowanie UV, wybór LOD i filtrowanie działają tak samo, jak w przypadku dwóch rozmiarów tekstur.

Generowanie mipsów dobrej jakości dla tekstur bez potęgi dwóch jest nieco trudniejsze, ponieważ we wszystkich przypadkach nie można po prostu uśrednić pola pikseli 2x2 do próbkowania w dół. Jednak filtr pudełkowy 2x2 nie był tak dobry na początek, dlatego zaleca się stosowanie lepszego filtra próbkowania w dół, takiego jak Mitchell-Netravali, niezależnie od wielkości tekstury.

Nathan Reed
źródło
1
Czy istnieje rozbieżność między tą odpowiedzią a odpowiedzią Johna Calsbeeka? Czy implementacja pasuje do obu opisów? Jeśli nie, to warto mieć odniesienie do jednego lub drugiego (lub obu, jeśli są to dwie różne techniki w użyciu).
trichoplax
4

Jednym ze sposobów, aby o tym pomyśleć, jest to, że karty graficzne często implementują tekstury inne niż 2, po prostu wypełniając je, aż uzyskają potęgę 2 w każdym kierunku. To sprawia, że ​​większość rzeczy „po prostu działa”: na przykład kafelkowanie i filtrowanie sprzętu. Jedyne, co należy zmienić, to konwersja współrzędnych tekstury na współrzędne obrazu.

Jeśli tak zaimplementowane, oczywiste jest, jak wykonać mipmapowanie: nic się nie zmienia. Nawet jeśli masz procesor graficzny obsługujący tekstury bez zasilania 2 bez dopełniania, poziomy mipmap skończyłyby się na „dopełnianiu”. np. tekstura 3x3 miałaby teksturę 2x2 jak lod 1.

John Calsbeek
źródło
Czy istnieje niezgodność między tą odpowiedzią a odpowiedzią Nathana Reeda? Czy implementacja pasuje do obu opisów? Jeśli nie, to warto mieć odniesienie do jednego lub drugiego (lub obu, jeśli są to dwie różne techniki w użyciu).
trichoplax
1
@trichoplax Myślę, że stwierdzenie Nathana, że ​​„generowanie dobrej jakości mipsów dla tekstur bez potęgi dwóch jest nieco trudniejsze” sprawia, że ​​nasze odpowiedzi przynajmniej trochę się nie zgadzają. Samo to chyba zasługuje na więcej rozwinięcia.
John Calsbeek,
1
Myślę, że problemem jest to, że mylimy logiczną pozycję tekstur z ich „fizycznym” układem w pamięci. 1) Piksele są elementami dyskretnymi, tzn. Zawsze potrzebujesz wymiaru całkowitego, a więc skalowanie w dół nieparzystego wymiaru oznacza, że ​​musimy zaokrąglić w górę lub zaokrąglić w dół. Ponieważ musimy zaokrąglić w górę, gdy dojdziemy do tekstury Nx1 lub 1xN, sensowne jest zawsze zaokrąglanie w górę. 2) Kiedy układane są w fizycznych adresach, często zdarza się, że teksturowane są jakieś „wygodne” „kroki”. Można to zrobić z 2 powodów: a) może to spowodować, że sprzęt będzie tańszy & b) jeśli zamówienie P. 2 Morton jest łatwe.
Simon F