DDS

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Was ist DDS?

DDS steht für "Direct Draw Surface" und ist ein eigenes für Texturen (und damit 3D-Anwendungen) entwickeltes Bildformat von Microsoft (basierend auf S3Tc). Im Gegensatz zu herkömmlichen Bildformaten bringt es daher einige sehr wichtige Funktionen mit, die es für die 3D-Programmierung als perfektes Texturformat prädestinieren. Das Format ist zudem frei nutzbar, es fallen also keine Lizenzgebühren an, und man bewegt sich auch nicht in einem Graubereich, denn diverse "freie" Bildformate sind eigentlich nur bedingt frei nutzbar. Während normale Bildformate feste Spezifikationen besitzen und nur zu einem gewissen Grad anpassbar sind (z.B. PNG mit 8 Bit oder 24 Bit, Kompressionsrate bei JPG, etc.) ähnelt DDS mehr einem Containerformat (ähnlich wie bei Videocodecs) und kann unterschiedlichste Texturinformationen beinhalten.


Was kann man in DDS ablegen?

DDS speichert neben 2D-Texturen auch Cubemaps und Volumentexturen (3D-Texture). Besonders bei den Cubemaps ist es sehr praktisch diese alle in einer Datei ablegen zu können, was mit DDS problemlos möglich ist.

Eines der wichtigsten Features ist jedoch die Möglichekit Mipmaps direkt in der Textur speichern zu können. Dadurch hat man zum einen direkten Einfluss auf die Generation der Mipmaps (können je nach Plugin sogar komplett selbst erstellt werden oder werden von diesem mit anpassbaren Parametern errrechnet). Bei allen anderen Formaten muss man diese entweder über gluBuildMipMaps generieren lassen, was sehr langsam ist, also die Ladezeiten der Anwendung stark erhöht und keinerlei Einstellungen zulässst, oder man lässt die Mipmaps auf aktuelleren Karten direkt in der Hardware generieren (passiert über die entsprechende Extension). DDS stellt hier also den Idealfall dar, denn die dort abgelegten Mipmaps werden direkt mit der Textur in den VRAM übertragen.


Welche Formate kann DDS?

Im DDS-Format können so gut wie alle aktuell genutzten Texturformate abgelegt werden. Das Format ist zudem erweiterbar, sollte es also irgendwann z.B. neue Grafikkarten mit neuen Kompressionsformaten geben, kann DDS erweitert werden. Folgende Format (evtl. gibt es noch weitere, die Liste basiert auf dem Plugin von NVidia) können dort gespeichert werden :

Komprimierte Formate (fester Kompressionsratio)

Format Ratio BPP Kanäle Bemerkung
DXT1 8:1 4 (A)RGB Wahlweise mit 1 Bit Alpha
DXT3 4:1 8 ARGB Expliziter Alphakanal
DXT5 4:1 8 ARGB Interpolierter Alphakanal

Da alle diese komprimierten Formate einen festen Kompressionsratio aufweisen, sollte man vorher überlegen ob bzw. welches dieser Formate für die entsprechende Textur in Frage kommt. Also Beispiel sei hier ein blauer Himmel mit weichen Farbübergängen genannt, der durch die feste Kompression u.U. so schlecht aussehen kann dass man hier ein unkomprimiertes Texturformat wählen muss, denn durch die feste Kompression können ggf. ungewollt harte Farbübergänge entstehen die störend auffallen.

dds differenz.jpg

Auf obigem Bild sieht man rechts die um ein vielfaches (Faktor 100) verstärkte Differenz zwischen der Grundversion (PNG, verlustfrei) und der als DXT gespeicherten Version der linken Textur. In der Praxis fällt der Unterschied natürlich nicht so stark aus, ist aber je nach Textur mit bloßem Auge zu erkennen.

Fließkommaformate (unkomprimiert)

Besonders in letzter Zeit hat sich auch in der 3D-Programmierung sog. HDR durchgesetzt (High Dynamic Range), mit welchem man realistische Lichtverältnisse und v.a. Wechsel dieser Lichterverähltnisse sehr gut simulieren kann (z.B. wenn man von einen dunklen Tunnel verlässt, dann brauchen die Augen normalerweise kurz um sich auf die Helligkeit einzustellen). Dazu benötigt man Texturformat die pro Kanal mehr als 8 Bit speichern können, und auch hier kann man DDS nutzen. Hinweis : DDS unterstützt auch Integerformate mit mehr als 8 Bit pro Kanal (16 Bit), die auf alten Karten für HDR genutzt werden können, dann aber nicht so gute Ergebnisse erzielen.

Das DDS-Format unterstützt sowohl Fließkommaformate mit 16-Bit pro Farbkanal (max. 64 Bit) als auch Formate mit 32-Bit pro Farbkanal (max. 128 Bit).

Sonstige Formate

DDS kann zusätzlich noch eine Reihe weiterer Formate speichern. Darunter Standardformate (unkomprimiert), also z.B. 8-Bit ARGB, Palettenformate und spezielle Formate wie DXT5_NM (für Normalmaps) und das verbesserte Normalmapformat 3DC (von ATI entwickelt, besser für Normalmaps geeignet als DXT5_NM).


Nutzung

Anwendungen

Für alle aktuellen Bildbearbeitungsprogramme und 3D-Modeller dürfte es inzwischen (wenn nicht bereits integriert) Importer und Exporter für dieses Format geben.


nv dds plugin photoshop.jpg

(Obiger Screenshot zeigt den Exportdialog des NVidia-Plugins für Adobes Photoshop)



Betriebssystem

Für die meisten Entwickler ist es sehr praktisch direkt im Dateibrowser des Betriebssystems Texturen usw. sehen zu können. Leider bieten Betriebssysteme für das DDS-Format im Regelfall keine Vorschau, allerdings gibt es auch hier Plugins die sich direkt in den Dateibrowser einklingen, auch von NVidia. Leider funktioniert dies jedoch nur in 32-Bit Umgebungen, für 64-Bit Betriebssysteme muss man also woanders nach Alternativen suchen, z.B. MysticThumbs (Freeware).


Implementation

Delphi/Pascal

Inzwischen gibt es auch für Delphi mit Lossys glBitmap eine Bibliothek mit der man direkt DDS-Texturen laden kann. Alternativ kann man auch direkt den (etwas älteren) Loader von Mars aus unserem Forum nehmen. Wie der grundlegende Quellcode für einen DDS-Loader aussieht kann man aus diesem Dokument von NVidia entnehmen (C++).

OpenGL

Damit man komprimierte Texturen in OpenGL nutzen kann muss die Grafikkarte über die Extension GL_ARB_texture_compression verfügen. Da DDS allerdings auf S3Tc aufbaut, dürfte diese Extension auf allen Grafikkarten die innerhalb der letzten 8 Jahre produziert wurden funktionieren.


Sonstige Links

Texturetools von NVidia Umfangreiches Paket an Bibliotheken, Kommandozeilentools und Dokumentation rund um DDS The Compressonator Texturkompressionsanwendung von ATI