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?
opengl
textures
performance
Wille
quelle
quelle
Antworten:
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:
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.
quelle
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
quelle
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.
quelle
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
quelle
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.
quelle