Okay, ich verwende C ++ mit OpenGL und erstelle einen Loader zum Laden von Texturen für mein 3D-Spiel. (Aber die Texturen sind 2D). Ich möchte die Option der Transparenz, auch wenn ich mich entscheide, sie nicht zu verwenden. Ich brauche anständige Qualität, obwohl es nicht unbedingt erstklassig sein muss. Was schlagen Sie Jungs für das Format (PNG, TGA, etc.). Vielleicht ist es auch ganz einfach, einen Loader dafür zu erstellen (ich verwende keinen bereits erstellten). Und wenn Sie Links / Tipps haben, die Ihnen beim Laden helfen, wäre dies sehr hilfreich.
13
Das Bildtexturformat ist auch eine Leistungswahl. Ich empfehle Ihnen, so viel wie möglich komprimierte Texturen zu verwenden. Auf mobilen Plattformen können die Leistung (40% oder mehr), die Speichernutzung und das Laden der Zeit erheblich verbessert werden.
Betrachten Sie eine Textur 1024 * 1024:
In unseren Spielen haben wir Assets (Texturen) in vielen Formaten:
Aus Kompatibilitätsgründen verwenden wir das RAW-Format, dies dient jedoch der Kompatibilität oder der Verwendung von GUI-Elementen
ETC1-Texturen haben keinen Alpha-Kanal, daher verwenden wir einen speziellen Shader mit zwei Texturen (RGB-Textur und Alpha-Textur). Komprimiertes Format sind sehr einfach zu laden (100 oder 200 loc).
Auf dem Desktop ist DXTC (S3TC) auf vielen Karten vorhanden. Also solltest du es benutzen.
Komprimierte Texturen
Profi
Con
quelle
Texturen sind Sammlungen von einem oder mehreren Bildern. Dies bedeutet , dass eine Textur könnte durch ein TGA oder PNG dargestellt werden, aber weder Format ist in der Lage , alle möglichen Funktionen von Texturen darstellen. Warum?
Denn jeder kann nur ein einziges Bild halten. Es gibt keine Mipmaps. Es sind keine 3D-Texturen möglich. Keine Array-Texturen. Keine Cubemaps. Jede dieser Dateien ist nur ein einzelnes 2D-Bild. Sie können Teil einer Textur sein, aber eine einzelne Bilddatei in diesen Formaten kann keine Textur sein, es sei denn, Sie verwenden kein Mipmapping (und ich rate nachdrücklich davon ab, Mipmaps zu verwenden, es sei denn, Sie haben bestimmte Anforderungen).
Sie sind feine Bildformate, aber sie machen schlechte Texturformate .
DDS ist der Spitzenreiter bei Texturformaten, da es tatsächlich Dinge unterstützt, die Texturen benötigen. Es unterstützt Mipmaps und Cubemaps. Es unterstützt 3D-Texturen. DDSv10 unterstützt Array-Texturen. Sie können eine einzelne Textur in einem DDS so verpacken, wie Sie es mit PNG oder TGA nicht könnten.
DDS unterstützt unkomprimierte und komprimierte Texturdaten. Solange das komprimierte Texturformat eines der DXT / BC-Texturformate ist.
PKM ist nützlich zum Packen von ETC1-komprimierten Bildern, unterstützt jedoch wie PNG keine tatsächlichen Texturfunktionen.
PVR-Dateien scheinen das mobile Äquivalent zu DDS zu sein (obwohl ich nicht weiß, warum sie nicht einfach DDS verwenden konnten). Sie unterstützen verschiedene Komprimierungstechniken, es fehlen jedoch erweiterte DDSv10-Funktionen wie Array-Texturen sowie 3D-Texturunterstützung.
DDS gewinnt also in Bezug auf umfassende Texturunterstützung.
quelle
Die Khronos Group empfiehlt das KTX-Dateiformat zum Speichern von Texturen für OpenGL- und OpenGL ES-Anwendungen. Sie können libktx verwenden, um mit diesem Format zu arbeiten.
Eigenschaften:
quelle
DDS (DirectDraw Surface) scheint derzeit die beliebteste Wahl für Texturen zu sein. Es hat verschiedene Pixelformate, Transparenz und Komprimierung. Es wird in OpenGL über die Erweiterung GL_ARB_texture_compression unterstützt.
Zum Beispiel gibt es einen OpenGL - Loader hier .
quelle
Hier gibt es eine Reihe von Überlegungen:
TGA ist eine gute Wahl, da Sie in den unkomprimierten 24- und 32-Bit-Fällen die Daten in einem einzigen Fread lesen und das Ergebnis ohne weitere Verarbeitung direkt über glTexImage2D senden können. Es ist eine schlechte Wahl, da es die größte Dateigröße haben kann und wenn Festplatten-E / A ein Engpass ist, werden Ihre Lesevorgänge langsam sein.
PNG ist eine gute Wahl, da es die Qualität von Bildern mit einer relativ kleinen Dateigröße bewahrt. Es ist eine schlechte Wahl, da PNGs nur langsam dekomprimiert werden können - wenn das dann Ihr Engpass ist - wissen Sie.
JPG ist eine gute Wahl, da es im Allgemeinen die kleinste Dateigröße hat und sich sehr schnell von der Festplatte löst (doppelt gut, wenn Sie die Datei über ein Netzwerk senden müssen). Es ist eine schlechte Wahl, da zwischenzeitliche Software-Dekomprimierungsschritte und Qualitätsverluste auftreten (obwohl Sie die Qualitätseinstellungen anpassen können, um dies zu mildern). Auch kein Alphakanal.
DDS (oder andere komprimierte Formate) sind aufgrund der geringeren Dateigröße und der Möglichkeit, eine vorgefertigte Mipmap-Kette einzuschließen, eine gute Wahl. Wenn es sich um ein Format handelt, das von Haus aus von der Hardware unterstützt wird (und DDS von Haus aus von den meisten Consumer-PCs unterstützt wird - auch schon seit langer Zeit), haben Sie den gleichen Vorteil wie TGA: Ein Problem, ein bisschen Stöbern im Header, um es herauszufinden einige Bildeigenschaften, dann senden Sie die Daten ohne Zwischenschritte direkt durch. Komprimierte Texturen beschleunigen außerdem die Ausführung Ihres Programms und belegen weniger Video-RAM. Sie sind keine gute Wahl, da sie eine verlustbehaftete Komprimierung verwenden (was manchmal sehr auffällig sein kann) und möglicherweise nicht auf jeder Hardware unterstützt werden.
Wenn ich es wäre, würde ich die Unterstützung für alle 4 dieser Formate aufbauen (TGA und DDS sind ziemlich trivial, um Loader zu schreiben, mit JPG und PNG würde ich eine Bildbibliothek verwenden), damit Inhaltsersteller das am besten geeignete Format auswählen können eine Pro-Textur-Basis.
quelle
Und natürlich können Sie immer mit dem alten 32-Bit-BMP arbeiten, der sehr einfach zu laden ist (insbesondere, wenn die Größe eine Potenz von 2 ist (tatsächlich ein Vielfaches von 8 Byte IIRC)).
Ansonsten scheint es seltsam, dass Sie nur ein Format wollen, jpg ist wirklich cool für schöne reale hochauflösende Texturen (jpeg verwundert mit Speicherplatz und (Runter-) Ladezeiten), png für Transparenz und das gelegentliche 32-Bit-BMP für Kontrolltexturen (einfach aus einem Skript oder einem 'schnellen und schmutzigen' Tool zu erstellen).
quelle