Wie funktioniert Mip-Mapping mit Nicht-Power-of-2-Texturen?

12

Ich habe gehört, dass die neuesten GPUs alle Nicht-Power-of-2-Texturen unterstützen und alle Funktionen einfach funktionieren. Ich verstehe jedoch nicht, wie Mip-Mapping in einem solchen Szenario funktionieren würde. Kann das jemand erklären?

ap_
quelle

Antworten:

12

Die Regel ist, dass Sie zur Berechnung der nächsten Mipmap-Größe durch zwei dividieren und auf die nächste Ganzzahl abrunden (es sei denn, es wird auf 0 abgerundet, in diesem Fall ist es stattdessen 1). Ein 57x43-Bild hätte beispielsweise Mipmaps wie:

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

UV-Mapping, LOD-Auswahl und Filterung funktionieren genauso wie bei Texturgrößen mit Zweierpotenz.

Das Generieren von Mips mit guter Qualität für eine Textur ohne Zweierpotenz ist etwas komplizierter, da Sie nicht einfach einen Durchschnitt von 2 x 2 Pixel für das Downsample in allen Fällen berechnen können. Allerdings war ein 2x2-Box-Filter anfangs nicht so toll, weshalb die Verwendung eines besseren Downsampling-Filters wie Mitchell-Netravali unabhängig von der Texturgröße empfohlen wird.

Nathan Reed
quelle
1
Gibt es eine Meinungsverschiedenheit zwischen dieser Antwort und John Calsbeeks Antwort? Entspricht die Implementierung beiden Beschreibungen? Wenn nicht, wäre es nützlich, eine Referenz für das eine oder andere zu haben (oder für beide, wenn es sich um zwei verschiedene Techniken handelt, die beide verwendet werden).
Trichoplax
4

Man kann sich das so vorstellen, dass Grafikkarten häufig Texturen ohne Zweierpotenzen implementieren, indem sie sie einfach auffüllen, bis sie in jeder Richtung eine Zweierpotenz haben. Dadurch funktionieren die meisten Dinge "nur": Kacheln und Hardware-Filterung zum Beispiel. Das einzige, was geändert werden muss, ist die Konvertierung von Texturkoordinaten in Bildkoordinaten.

Bei einer solchen Implementierung ist es offensichtlich, wie Mipmapping durchgeführt wird: Es ändert sich nichts. Selbst wenn Sie eine GPU haben, die Texturen ohne Auffüllung ohne Potenz von 2 unterstützt, würden die Mipmap-Ebenen mit "Auffüllung" enden. zB würde eine 3x3 Textur eine 2x2 Textur als lod 1 haben.

John Calsbeek
quelle
Gibt es eine Meinungsverschiedenheit zwischen dieser Antwort und der Antwort von Nathan Reed? Entspricht die Implementierung beiden Beschreibungen? Wenn nicht, wäre es nützlich, eine Referenz für das eine oder andere zu haben (oder für beide, wenn es sich um zwei verschiedene Techniken handelt, die beide verwendet werden).
Trichoplax
1
@trichoplax Ich denke, Nathans Behauptung, dass "das Erzeugen von Mips mit guter Qualität für eine Nicht-Zweierpotenz-Textur ein wenig kniffliger ist", lässt unsere Antworten zumindest ein wenig widersprechen. Das allein verdient wahrscheinlich mehr Ausarbeitung.
John Calsbeek
1
Ich denke, das Problem dabei ist, dass wir die logische Position von Texeln mit ihrem "physischen" Layout im Speicher verwechseln. 1) Pixel sind diskrete Elemente, dh Sie benötigen immer eine ganzzahlige Dimension. Wenn Sie also eine ungerade Dimension verkleinern, müssen Sie entweder auf- oder abrunden. Da wir aufrunden müssen, sobald wir eine Nx1- oder 1xN-Textur haben, ist es sinnvoll, immer aufzurunden. 2) Bei der Anordnung in physischen Adressen ist es nicht ungewöhnlich, die Textur auf eine "bequeme" "Schrittgröße" aufzupolstern. Dies kann aus zwei Gründen geschehen: a) Es kann HW billiger machen und b) wenn eine Bestellung von P.of.2, Morton einfach ist.
Simon F