Warum ist die Auflösung von Texturen in Spielen immer eine Zweierpotenz (128x128, 256x256, 512x512, 1024x1024 usw.)? Wäre es nicht klug, die Dateigröße des Spiels zu speichern und die Textur genau auf das UV-Modell abzustimmen?
Was würde passieren, wenn es eine Textur gäbe, die keine Zweierpotenz wäre?
Wäre es falsch, wenn eine Textur etwa 256x512 oder 512x1024 wäre? Oder würde dies die Probleme verursachen, die durch Nicht-Zweierpotenz-Texturen verursacht werden können?
Antworten:
Wie in Byte56 impliziert, bestehen die Größenbeschränkungen für "Zweierpotenzen" darin, dass jede Dimension unabhängig eine Zweierpotenz sein muss und nicht, dass Texturen quadratisch sein müssen und Dimensionen haben müssen, die Zweierpotenzen sind.
Bei modernen Karten und welchen modernen Grafik-APIs wurde diese "Einschränkung" jedoch erheblich gelockert, sodass die Texturdimensionen innerhalb eines vernünftigen Rahmens so gut wie alles sein können, was Sie möchten. Jedoch:
Indem sichergestellt wird, dass die Texturdimensionen eine Zweierpotenz haben, kann die Grafikpipeline Optimierungen in Bezug auf die Effizienz beim Arbeiten mit Zweierpotenzen nutzen. Zum Beispiel kann es schneller sein (und war vor einigen Jahren, bevor wir dedizierte GPUs und äußerst clevere Optimierungscompiler hatten), zu dividieren und mit Zweierpotenzen zu multiplizieren. Das Arbeiten mit Zweierpotenzen vereinfacht auch Vorgänge innerhalb der Pipeline, z. B. das Berechnen und Verwenden von Mipmaps (eine Zahl mit Zweierpotenzen wird immer gleichmäßig in zwei Hälften geteilt, sodass Sie sich nicht mit Szenarien befassen müssen, in denen Sie runden müssen Ihre Mipmap-Dimensionen nach oben oder unten).
Es ist wahr, dass Sie auf diese Weise Speicherplatz "verschwenden", aber der zusätzliche Speicherplatz lohnt sich normalerweise für den Kompromiss bei der Renderleistung. Darüber hinaus gibt es Techniken wie das Komprimieren oder Packen mehrerer Bilder in einen einzelnen Texturraum, mit denen ein Teil des Speichermülls eingespart werden kann.
quelle
Texturen sind nicht immer quadratisch und nicht immer Potenzen von zwei . Der Grund, warum sie in der Regel Zweierpotenzen sind, ist die höhere Kompatibilität mit älteren Grafikkarten, die diese Einschränkung auferlegt haben. Bei nicht quadratischen Texturen ist dies normalerweise kein Problem. Zusammenfassen:
D3DPTEXTURECAPS_SQUAREONLY
Funktion verfügt, habe ich auch mit älterer Hardware problemlos mit nicht quadratischen Texturen gearbeitet.quelle
Es bezieht sich auf Grafikkartenoptimierungen. Sie wurden entwickelt, um sie auf diese Weise zu verarbeiten. Die meisten Karten in diesen Tagen wird können Sie Texturen mit Dimensionen laden , die nicht Potenzen von zwei sind, aber es wird wahrscheinlich einen negativen Einfluss auf die Leistung haben. Es besteht eine gute Chance, dass das Laden tatsächlich konvertiert wird, was Sie Zeit kostet und keinen Speicher spart. Nicht quadratische Texturen sind im Allgemeinen in Ordnung, solange beide Dimensionen Potenzen von zwei sind.
Eine Möglichkeit, mit Texturen ungerader Größe umzugehen, ist die Verwendung eines Texturatlas . Grundsätzlich fügen Sie mehrere Texturen zu einer einzigen Textur zusammen und verwenden die Texturkoordinaten Ihrer Scheitelpunkte, um auf das gewünschte Bild zu verweisen. Dies bringt zusätzliche Leistungsvorteile mit sich, da Zustandsänderungen vermieden werden können. In der Regel werden dabei alle Elemente der Benutzeroberfläche in einer einzigen Textur angeordnet. Wenn Sie also die Eckpunkte der Benutzeroberfläche in einem einzigen Pufferobjekt zusammengefasst haben, können Sie das Ganze mit einem einzigen Aufruf zeichnen, anstatt die Texturen zu wechseln viele Male und machen einen separaten Draw Call für jeden.
quelle
Das Problem ist, dass manche Hardware nur eingeschränkte Unterstützung für Texturen bietet, die keine zweidimensionale Potenz haben.
Sehen Sie sich beispielsweise unten http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx an und lesen Sie dort die Fußnoten 3 und 4.
quelle
Grafikhardware ist für Matrixoperationen, Fragmentoperationen und Vektoroperationen optimiert. Einfach ausgedrückt, quadratische Matrizen sind einfacher zu handhaben, da Berechnungen in Blöcken (als Fragmente bezeichnet) durchgeführt werden können. Die Hardware ist für Blockoperationen optimiert. Deshalb gibt es beispielsweise Dateipuffer. Das RAM-Blit wird erst nach einem Block auf die Festplatte übertragen wurde besiedelt. Gleiches gilt für den Grafikspeicher.
Der Einzelbildpuffer besteht aus Fragmenten, die quadratisch sind. In einem Bildschirm mit einer Auflösung von 800 x 600 und einem RGB-Farbraum (0 bis 255) gibt es beispielsweise 800 x 600 Punkte mit 3 Bytes pro Kanal. Im Bildspeicher müssen insgesamt 3 x 800 x 600 = 1.440.000 Bytes adressiert werden. Das heißt, es gibt 1.875 adressierbare Fragmente mit einer Größe von 256 x 256 x 3 Byte. Da die Texturdaten quadratisch sind, ist die Zuordnung von der GRAM-Matrix zur Bildschirmpuffermatrix mithilfe der bikubischen Skalierung erheblich einfacher. Wenn die Verzerrung für die längere Seite nicht quadratisch wäre, würde die Berechnung bei Bedarf mehr Zeit in Anspruch nehmen skaliert werden.
Viele Grafik-APIs akzeptieren nicht quadratische Texturdaten, da sie UV-Zuordnungskoordinaten als Gleitkommadaten akzeptieren. Sobald sie an die GPU gesendet werden, werden die Texturdaten jedoch aufgefüllt, da die tatsächlichen Bildanteile die Zuordnung nicht ändern scheint nicht betroffen zu sein, jedoch werden die Texturdaten aufgefüllt, da die GPU sie gerne als perfektes Quadrat anspricht.
Wenn also ein Bild mit einer Größe von 100 x 1024 und ein Bild mit einer Größe von 1024 x 1024 verwendet wird, gehen 946.176 Byte verloren. Dies gilt umso mehr, wenn zusammengesetzt werden soll, da ein Alpha-Kanal hinzugefügt werden muss, um anzuzeigen, dass die Fülldaten die zusammengesetzte Textur nicht beeinflussen sollen.
quelle
Unsere digitale Welt arbeitet mit binärer Nummerierung, um dann einen Wert zu multiplizieren oder durch 2 zu teilen. Sie können einen Wert nach links oder rechts "verschieben", dh
Das Arbeiten mit Werten "Zweierpotenz" ist für eine CPU einfacher.
quelle
Moderne Hardware kommt (endlich) damit zurecht, Wrap-Modi für nicht-leistungsfähige zwei-basierte Texturen zu aktivieren. Nicht-leistungsfähige zwei Texturen verschwenden jedoch immer noch GPU-Speicher, da sie dazu neigen, entlang der Breite um eine hardwarespezifische Menge (entweder) aufgefüllt zu werden auf eine Kachelgröße oder aufgerundet auf die nächste Potenz von zwei Größen, die die Textur enthalten).
Da dies hardwareabhängig ist und die Hersteller im Allgemeinen nicht auf die Einzelheiten dieser Details eingehen, ist es am sichersten, weiterhin zweidimensionale Leistung für Texturen zu verwenden, um keinen GPU-RAM zu verschwenden.
quelle