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ć?
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:
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.
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.
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.
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.
źródło