Was ist die optimale Texturgröße?

12

Ich habe meinem Projekt kürzlich einen Textur-Packager hinzugefügt, der eine bestimmte Anzahl von Texturen in eine einzige packt, wie folgt:

Gepackte Textur

So ist diese beispielsweise 582 x 1023 Pixel groß. Das Ziel des Hinzufügens dieser gepackten Texturen bestand offensichtlich darin, die Leistung zu verbessern. Daher wollte ich die optimale Texturgröße für OpenGL-Texturen (unter Verwendung von LWJGL) ermitteln. Die Dinge , die ich gefunden waren , dass eine breite Unterstützung maximale Texturgröße scheint 1024x1024 zu sein, nach dieser zum Beispiel. Das kommt mir merkwürdig vor, weil natürlich viele Texturen größer wären, was passiert also mit denen? Ich bin mir ziemlich sicher, dass die meisten Grafikkarten größere Texturen unterstützen. Kann ich davon ausgehen, dass die meisten Grafikkarten z. B. Texturen im Format 4096 x 4096 (oder sogar größer) verarbeiten?

Um zu meinem zweiten Punkt zu kommen (ich hoffe, dies zählt immer noch als eine Frage, aber es läuft im Wesentlichen auf dasselbe Problem hinaus): Sollten Texturen mit einer Potenz von 2 (256x256, 512x512, 1024x1024, 2048x2048, ..) dimensioniert sein und sollten Ich fülle gepackte Texturen auf, die kleiner sind als die nächste Potenz von 2? Gemäß dieser Frage aus dem Jahr 2011 ist es nicht erforderlich, kann aber Fehler Leistung und vermeiden kleineren verbessern und diese von 2012 sagt , dass Sie sollten auf jeden Fall Pad Texturen. Mir ist also klar, dass diese Fragen schon einmal gestellt wurden, aber sie sind relativ alt, damit sich die Antworten geändert haben, und außerdem beantworten sie jeweils nur teilweise meine Frage. Wie gehen andere Projekte damit um?

TL; DR: Mit welchen Texturgrößen kann ich bei den meisten Grafikkarten rechnen? Was sind die optimalen Texturgrößen (oder gibt es)? Soll ich Texturen mit der nächsten Potenz von 2 auffüllen?

Flotothemoon
quelle
4
Die GPU verarbeitet nur Potenzen von 2. Wenn Sie Ihre Texturen nicht manuell auffüllen, übernimmt die GPU (oder die Game Engine Ihrer Wahl) dies für Sie. Dies führt zu einer leichten Verzögerung zur Laufzeit pro Textur, die sich summieren kann. Ich kann jedoch keine Hilfe zu maximalen / optimalen Texturgrößen anbieten.
Ketura
@ketura Ah, ich verstehe, danke. Angenommen, ich habe ein Bild mit einer Größe von 513 x 10. Wäre es schneller, es auf 1024x1024 aufzufüllen und dann alle diese leeren Pixel zu übertragen oder die GPU das machen zu lassen?
Flotothemoon
4
Sie müssten nicht so hoch gehen. 1024 x 16 würde funktionieren; Es muss nicht SQUARE sein, sondern nur eine Potenz von 2 in jede Richtung. Allerdings würde ich in diesem Fall ernsthaft überlegen, ob ich nicht ein Pixel sparen und es auf 512x16 bringen könnte, lol.
Ketura

Antworten:

6

Ich werde versuchen, darauf zu antworten, obwohl YMMV. Ich verwende die Steam-Hardware-Umfrage ( http://store.steampowered.com/hwsurvey?platform=pc ), um festzustellen, welcher Video-RAM (VRAM) auf den meisten Computern verfügbar ist. Betrachtet man die Ergebnisse vom 13.10.2015 (heute), so haben fast 85% der Menschen 1024 MB VRAM.

Ihre Frage ist sehr weit gefasst, da sie nicht die Zielhardware (Konsole, PC, Handheld, mobile Geräte?) Angibt. Ich werde über PCs sprechen und Sie können auf der Grundlage der Hardwarespezifikationen für andere Plattformen extrapolieren.

Unter der Annahme von 32 Bit Farbe + Alpha pro Pixel, dh 4 Bypes pro Pixel, kann 1 GB VRAM maximal ~ 256 Millionen Pixel enthalten. Dies entspricht 256 1K mal 1K-Texturen. Dies setzt (fälschlicherweise) voraus, dass Sie nur Texturen in Ihrem VRAM speichern möchten, während es eine ganze Reihe anderer Dinge gibt (z. B. Mesh-Daten, wenn Sie in 3D arbeiten), für die Sie Platz lassen müssen. Sie möchten wahrscheinlich auch mehr Platz für Mip-Mapping von Texturen einräumen, was normalerweise am besten funktioniert, wenn Ihre Texturen Potenzen von zwei haben.

Moderne Konsolen (XBOX One und PS4) verfügen über 4 bis 8 GB einheitlichen Arbeitsspeicher, die meisten Handhelds und Mobilgeräte verfügen über 1 bis 2 GB einheitlichen Arbeitsspeicher, mit Einschränkungen, wie viel Sie als VRAM zuweisen können.

Normalerweise erstelle ich 2K-Texturen, so dass sie auf den meisten PCs funktionieren und die Option zum Verkleinern für Geräte mit niedrigerer Auflösung ermöglichen. Wenn Sie ein 2D-Spiel schreiben und auf Displays mit höherer Auflösung (4K, Retina-iPad usw.) abzielen möchten, können Sie 4K-Texturen für den Hintergrund verwenden, aber für die meisten anderen Teile ist dies möglicherweise zu viel.

Ich hoffe, das hat geholfen und das Wasser nicht getrübt.

Vijay Varadan
quelle
Danke für die Antwort, hilft definitiv. Was die Breite angeht, tut mir leid, ich habe einige Details vergessen: Ich entwickle für PCs in 2D. Was würde passieren, wenn Sie Texturen verwenden, die größer als die maximal unterstützte Texturgröße sind? Funktioniert es überhaupt nicht oder wird es nur langsamer?
Flotothemoon
1
Sieht so aus, als wäre meine Antwort genau richtig. Überprüfen anderer Site-Forenbeiträge 2k-Texturen sollten unterstützt werden, damit Ihr Spiel auf den meisten Geräten funktioniert. Die Beschränkung der Texturgröße hängt von der jeweiligen Hardware und der jeweiligen OpenGL-ES-Version ab. Ich bin nicht sicher, wie die spezifische Fehlermeldung lauten würde, aber sie würde von OpenGL-ES kommen, wenn Sie versuchen, die Textur zu laden. Hilfreiche Links: answers.unity3d.com/questions/563094/… , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 und feedback.wildfiregames.com/report/opengl/feature/…
Vijay Varadan
Wann versuche ich die Textur zu laden oder zu binden? Oder ist das hier dasselbe?
Flotothemoon