Bestes (beliebtestes?) Bildformat für die Texturierung [geschlossen]

13

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.

Brandon oubiub
quelle

Antworten:

15

Ich verstehe nicht, warum Sie keinen Standardlader verwenden möchten. Zum Beispiel ist PNG eine gute Wahl für ein Format, aber es ist komplex, einen Allzweck-Loader zu schreiben (und wahrscheinlich nicht die Mühe wert, einen zu schreiben, der nur die spezifische Teilmenge der PNG-Formate lädt, die Sie interessieren).

Angesichts dieser ungewöhnlichen Anforderung ist TGA wahrscheinlich die beste Wahl. TGA 2.0 hat einen Alpha-Kanal und ist im Vergleich zu PNG relativ einfach.


quelle
3
+1 für TGA, wenn OP seine eigene schreiben möchte. Ich habe einmal meinen eigenen TGA-Loader geschrieben. So schnell und schmerzlos.
Die kommunistische Ente
4
@Duck: Schmerzlos, solange Sie einfache TGAs ohne Komprimierung oder irgendwelche der ausgefallenen Funktionen ausführen. Wenn Sie einen voll kompatiblen TGA-Lader suchen, empfand ich das als etwas mühsam. Es ist eine Art seltsames Format.
ZorbaTHut
1
@ Zorba, Kompressionen einfach genug. Es ist nur so, ob Sie Erweiterungen mögen oder nicht.
verzögerte
10

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:

  • RGB oder RGBA (16 Bit): 2Mo (.5s zum Laden auf SGS)
  • RGBA (32 Bit): 4 MB (1 Sekunde zum Laden auf SGS)
  • PVRT (4bpp): 512ko (.125s zum Laden auf SGS)
  • ETC1 + Alpha: 1.5Mo (.4s zum Laden auf SGS)

In unseren Spielen haben wir Assets (Texturen) in vielen Formaten:

  • DDS-Format für DXTC-Texturen (Desktop-Plattformen: OS X, Linux, Windows & Tegra)
  • DDS-Format für ATC-Texturen (Andreno-GPUs)
  • PVR-Format für PVRT-Format (PowerVR-GPUs)
  • PKM-Format für ETC1-Textur (alle OGLES 2.0-Geräte kompatibel)

Aus Kompatibilitätsgründen verwenden wir das RAW-Format, dies dient jedoch der Kompatibilität oder der Verwendung von GUI-Elementen

  • PNG-Format für Rohtextur. Es ist für RGBA-16-, 24- oder 32-Bit-Texturen geeignet (wir verwenden einen MIT-lizenzierten Loader). Es handelt sich um unkomprimierte Texturen.

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

  • Texturfüllrate verbessert
  • Textur laden (4x oder mehr)
  • Einfach zu laden

Con

  • Wird nicht auf allen Plattformen unterstützt
  • Artefakte
Ellis
quelle
6
Es gibt einen großen Unterschied zwischen Texturen, die auf der Videokarte komprimiert sind (z. B. DXTC) und Texturen, die nur beim Speichern komprimiert werden und beim Laden dekomprimiert werden müssen (z. B. PNG). PNG ist langsamer zu laden als eine nicht komprimierte Textur, da es zuerst dekomprimiert werden muss. Sie sind zwar kleiner, aber der Grafikspeicher ist derselbe.
jhocking
8

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.

Nicol Bolas
quelle
2
TIFF unterstützt alle Funktionen von DDS und vieles mehr. Möchten Sie zusätzlich zu Alpha eine Textur mit Fern-, Nah-, R-, G-, B- und UV-Kanälen? In 64-Bit-IEEE-Gleitkomma pro Kanal? Komprimiert durch eine Reihe von Algorithmen (einschließlich JPEG und JPEG2000) als für den Kanal geeignet? Mit mehreren Bildern pro Datei und umfangreichen Metadaten für jedes einzelne von ihnen? Das alles und noch viel mehr. Es ist auch das "native" Format von Photoshop seit einiger Zeit. Nun, um einen Loader dafür zu schreiben ...
Martin Sojka
Gestatten Sie mir, weitere Informationen über die Anforderung hinzuzufügen, nur das DXT / BC-Texturformat unter dem DDS-Container zu verwenden. scheint nicht der Fall zu sein. Ich habe gesehen, wie Compressonator verschiedene Komprimierungsformate verwendet und als .dds für alle ausgegeben hat (dieser Hinweis wird in der Hilfeausgabe angezeigt, wenn die CLI ausgeführt wird) und [this] (answer) auf SO, dass Sie jedes Komprimierungsformat verwenden können (verschiedene FourCC-Einstellungen vornehmen) dann kümmern wir uns).
Haxpor
1
@haxpor: Sie können alles, was Sie wollen, in eine Datei schieben und sie als DDS bezeichnen. Die Frage ist, ob eine Anwendung, die normale DDS-Dateien lesen kann, Ihre Dateien lesen kann oder ob sie dafür speziell codiert werden muss. Das DDS-Format spezifiziert nur die DXT / BC-Komprimierungsformate (und ich nehme an, ASTC heutzutage). Was passiert, wenn Sie ein anderes Format verwenden, liegt zwischen dem Programm, das es schreibt, und dem Programm, das es liest. Das gilt aber für so ziemlich jedes Bildformat.
Nicol Bolas
@NicolBolas Danke, dass du es zusammengefasst hast. Ich denke das ist es.
Haxpor
5

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:

  • Instanziiere eine OpenGL-Textur aus einer KTX-Datei
  • Dekomprimieren Sie ein ETC1-komprimiertes Textur-Image, wenn die Hardware ETC1 nicht unterstützt.
  • Erstellen Sie eine Hash-Tabelle mit Schlüssel-Wert-Paaren aus der KTX-Datei, während die Textur geladen wird
  • Schreiben Sie eine KTX-Datei aus einem Array von Quellbildern und einer optionalen Hash-Tabelle von Schlüssel-Wert-Paaren.
  • Erstellen und füllen Sie eine Hash-Tabelle mit Schlüssel-Wert-Paaren.
KindDragon
quelle
3

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 .

Mrbinary
quelle
Ihre Antwort ist etwas verwirrend formuliert. Es macht keinen Sinn zu sagen, dass DDS in OpenGL unterstützt wird. OpenGL befasst sich nicht mit Bildformaten.
Rdb
3

Hier gibt es eine Reihe von Überlegungen:

  1. Wie schnell können Sie die Textur von der Festplatte in den Systemspeicher übertragen?
  2. Wie schnell Sie die Textur vom Systemspeicher auf die GPU übertragen können (in Ihrem Fall über glTexImage2D).
  3. Wie viel Speicherplatz und Video-RAM ist in Ihrem Budget.
  4. Leistung und Qualität.

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.

Maximus Minimus
quelle
1
"DDS wird von Haus aus auf den meisten Consumer-PCs unterstützt" DDS ist ein Container für verschiedene Formate. Sie übergeben keine DDS-Datei an eine GPU, sondern deren Inhalt!
Tara
0

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).

Valmond
quelle