Sollte ich Texturen verwenden, die nicht auf eine Zweierpotenz dimensioniert sind?


40

In den Anfängen von OpenGL und DirectX mussten die Texturgrößen Potenzen von zwei sein. Dies bedeutete, dass die Interpolation von Float-Werten mit Shifting und dergleichen sehr schnell erfolgen konnte.

Seit OpenGL 2.0 (und darüber hinaus über eine Erweiterung) werden Texturdimensionen ohne Zweierpotenzen unterstützt.

Haben Power-of-Two-Texturen Leistungsvorteile bei modernen integrierten und diskreten GPUs? Welche Vorteile haben Nicht-Zweierpotenzen-Texturen?

Verfügt eine beträchtliche Desktop-Population über Karten, die Nicht-Zweierpotenz-Texturen unterstützen?


Sehen Sie sich diese hervorragende Antwort auf eine ähnliche Frage an: Warum müssen Bilder für Texturen auf dem iPhone zweidimensionale Potenzen haben?
Dvole

Antworten:


15

Gibt es Leistungsvorteile beim Festhalten an Power-of-Two-Texturen auf modernen integrierten und diskreten GPUs?

Die meisten modernen GPUs unterstützen Non-Power-of-Two-Texturen (NPOT-Texturen) und verarbeiten diese gut. Der Leistungsabfall ist ziemlich gering. Es gibt jedoch einige Probleme zu berücksichtigen:

  • Bei Verwendung der NPOT-Textur wird mehr Speicherplatz im RAM benötigt, genau wie bei der POT-Textur der nächsten Größe. Technisch gesehen verschwendet man nur den Platz, der verwendet werden könnte, um dort etwas abzulegen.

  • NPOT-Texturen können im Vergleich zu POT der nächsten Größe merklich langsamer verarbeitet werden (in OpenGL 2.1 hatte ich einen Leistungsabfall von bis zu 30%).

  • Ältere GPUs und On-Board / On-Chip-GPUs sind nicht so weit fortgeschritten. Sie unterstützen häufig NPOT-Texturen, aber die Unterstützung ist recht langsam und unbeholfen.

  • Selbst ältere GPUs lehnen es möglicherweise ab, NPOT-Texturen überhaupt zu akzeptieren / anzuzeigen.

  • Es kann zu Kantenartefakten kommen, die durch Mip-Map-Interpolation verursacht werden. Ihre 25x25-Textur weist möglicherweise einen schwarzen Rand auf, an dem Pixel hinzugefügt wurden, um die Größe auf 32x32 zu erhöhen.

PS Ich bin mir nicht sicher, ob es sich um mobile Geräte handelt. Möglicherweise gibt es noch weitere Einschränkungen in Bezug auf POT-Texturen.

Welche Vorteile haben Nicht-Zweierpotenzen-Texturen, wenn überhaupt?

Soweit ich weiß gibt es nur 2 Vorteile:

  • Sie benötigen weniger Speicherplatz auf der Festplatte, wenn sie nicht gepackt sind (wenn leere Bereiche gepackt sind, wird nur sehr wenig hinzugefügt).
  • Sie können beim Schreiben von NPOT -> POT-Konverter Zeit sparen. Sie benötigen eine für die Release-Version, aber die Verwendung von NPOT-Texturen zum Entwerfen und Prototypen von Schnittstellen / Modellen ist in Ordnung

Gibt es eine große Anzahl von Desktop-Benutzern, die keine Karten haben, die Texturen ohne Zweierpotenzen unterstützen?

Soweit ich weiß und am PC getestet - ja. Dies beinhaltet den Hauptanteil der GPUs mit Geschwindigkeitsverlust / kleineren Fehlern und den Nebenanteil der Karten, die NPOT überhaupt nicht verarbeiten können.


6

Eine übliche Verwendung von Texturen ohne Zweierpotenz ist das Rendern von Zieltexturen, die für Nachbearbeitungseffekte verwendet werden, in Bildschirmgröße oder in halber Bildschirmgröße (usw.).

In diesen Fällen werden keine Mipmaps benötigt, der Puffer ist immer unkomprimiert, sodass ungerade Texturgrößen hier weniger Probleme verursachen


4

Es gab Einschränkungen für NPOT-Texturen auf älterer Hardware. Wie in diesem OpenGL-Wiki erwähnt , müssen NPOTs für einige ältere Hardware-Versionen keine Mipmaps haben. Komprimierte Texturen müssen mit 4 × 4 Pixeln ausgerichtet werden, neue Hardware sollte jedoch einwandfrei damit umgehen können.

Nach meiner Erfahrung wird die Leistung einiger noch relativ neuer Hardware erheblich beeinträchtigt, wenn Sie NPOT-Texturen anstelle von POTs verwenden. Ich weiß nicht, worum es geht; Es ist möglich, dass in einigen Kombinationen von Renderzuständen das Rendering tatsächlich in Software ausgeführt wird. Wenn Sie keine triftigen Gründe haben, würde ich empfehlen, immer noch zu versuchen, POTs so oft wie möglich zu verwenden.

Gründe für die Verwendung von NPOTs anstelle von POTs: Wenn Sie Bilder mit NPOT-Abmessungen haben, z. B. 1600 x 1200, wird bei der Verwendung von 2048 x 2048 Pixel viel Videospeicher verschwendet.


3
Wenn Sie Texturformate verwenden, die im Speicher komprimiert sind (z. B. PVR oder DXT), wird beim Skalieren auf die nächste Zweierpotenz deutlich weniger Texturspeicher benötigt als bei einer nicht komprimierten, aber kleineren NPOT-Textur.
Tetrad

3
Ihre Formulierung ist ein wenig vage. Es tut uns leid, wenn dies nicht mit dem übereinstimmt, was Sie sagen möchten. Komprimierte Texturen erfordern immer noch Pixelgrößen in Vielfachen von 4, selbst auf moderner Hardware, die NPOT-Texturen unterstützt.

1
Ich würde erwarten, dass die aktuelle Hardware weiterhin Texturen in den Treibern kachelt / wirbelt, wenn Sie sie hochladen. Dies ändert das Layout der Textur, um den Zugriff auf die Hardware zu optimieren. Konsolen (ohne XNA) erfordern, dass Sie diese Layoutoptimierung manuell in Ihrer eigenen Toolkette durchführen. Ich bin mir ziemlich sicher, dass diese nur auf POW2 funktionieren.
Roger Perkins

-1

Power-of-2-Texturen erhöhen die Leistung für jeden GPU-Typ um etwa 30%. Nicht nur alte GPUs (30% schneller ist der Unterschied zwischen einer High-End-GPU und einer durchschnittlichen) benötigen 30% mehr RAM, sondern auch weniger RAM, um die Qualität zu steigern Wenn Sie die richtige Texturgröße für eine bestimmte Entfernung bereitstellen, funktioniert dies wie Anti-Aliasing für Texturen. Dunkle Linien sollten von Game-Engines verarbeitet werden, und AAA-Engines behandeln sie einwandfrei


Dies bietet nur einen (bereits festgelegten) Vorteil von Zweierpotenz-Texturen. Die eigentliche Frage wird hier nicht beantwortet. Aus diesem Grund würden Sie bei den oben genannten Vorteilen Nicht- Zweierpotenz-Texturen verwenden.
Josh

Entschuldigung, ich habe die Frage falsch verstanden, durch Potenz von 2 sind Sie auf 2048, 1024, 512 usw. beschränkt. Dies ist wahrscheinlich der Hauptgrund
yusef ghatavi

non power of 2 sind auch nützlich für Texturen, die keine Mipmaps benötigen, wie GUI-Texturen und Texturen für Ego-Charaktere, die immer in der Nähe der Kamera sind
yusef ghatavi 29.07.15

-3

Meine Programmierkunst hat nur die richtige Größe.

Es vereinfacht sicherlich meine Anzeigelogik, zu wissen, dass ich, wenn ich eine Textur oben links auf dem Bildschirm festlegen möchte, nur 0,0 als die obere linke Seite der Textur festlegen kann und die gesamte Textur dort an der richtigen Stelle sehen kann, wohingegen Wenn ich ein Alpha-Polster hinzufügen müsste, wäre das Positionieren der Textur an der Kante des Bildschirms komplexer. Außerdem muss 0alpha natürlich noch Alpha-gemischt sein, und wenn ich auf opake Texturen schaue, mag ich es vielleicht vorziehen, keinen Alpha-Kanal zu haben.


6
Normalerweise positioniert man Polygone und keine Texturen auf dem Bildschirm. Die Polygone können mit allen erforderlichen UVs versehen werden - sie müssen nicht unbedingt von 0 auf 1 gehen. Wenn Ihre Textur nur 30 breit ist, ist es in Ordnung, zu 0,9375 zu wechseln (ein weiterer Grund, warum POT-Texturen gut sind - UVs sind genau darstellbar).
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.