glBitmap.pas

Bei der Unit glBitmap handelt es sich um einen Texturen Loader der ursprünglich nur für Windows (Delphi) verfügbar war. Die Idee dazu kam mir vor einigen Jahren, da mir die bestehenden Loadern nicht komplex genug waren. Mittlerweile unterstützt die Unit die gebräuchlichsten Datei und Texturformate. Die aktuelle Version bietet auch Unterstützung für FreePascal und somit auch für Linux.

Eine ausführliche Dokumentation zur glBitmap gibt es nur bedingt. Denn die Dokumentation im Wiki von DGL ist seit geraumer Zeit nicht mehr aktuell und es wird noch eine Weile dauern bis ich die Zeit finde sie entsprechend zu überarbeiten.

Unterstützte Dateiformate:

  • TARGA (*.tga)
    • 8, 16, 24 und 32 Bit
    • komprimiert und unkomprimiert
    • Ursprung oben links und unten links
  • JPEG (*.jpg)
    • Graustufen und RGB
  • Windows Bitmaps (*.bmp)
    • 8 (ignoriert Palette), 16, 24, 32 Bit
  • Portable Network Graphic (*.png)
    • Graustufen oder RGB mit oder ohne Alphakanal
  • Direct Draw Surfaces (*.dds)
    • 8, 16 24, 32 Bit; DXT1, DXT3, DXT5
    • Keine Cubemaps
    • Keine MipMaps

Hinweise zur Benutzung

Texturausrichtung

Der Loader erzeugt alle Texturen Top-Down. Das bedeutet die oberste Zeile der Textur befindet sich als Erstes im Speicher. Dieses Verhalten ist gegensätzlich zu einigen Loadern für Delphi, zu Windows Bitmap und auch zu einige Modeleditoren/Modelformat. Da ich es persönlich so angenehmer finde und sie an einigen Stellen innerhalb OpenGLs vorrausgesetzt werden, erzeuge ich nur Top-Down Texturen. Dies kann unter Umständen zu Verwirrungen führen. Es gibt aber genügend Möglichkeiten die Texturen zu manipulieren.

Konfiguration externer Schnittstellen

Ab der Version 2.0.0 unterstützt die glBitmap verschiedene Bilbiotheken und Schnittstellen zum Texturdatenaustausch. Da nicht dauerhaft alle aktiv sein können muss man zu Begin erst einmal konfigurieren welche man benutzen möchte. Auf diesen Sachverhalt weiß die glBitmap einem auch mit einer Compilerwarnung hin. Darauf sollte man hören. Wink Zu Auswahl stehen folgende Mögichkeiten.

  • GLB_NO_NATIVE_GL früher auch (NO_NATIVE_GL)
  • GLB_SDL
    • Aktiviert die Unterstützung von SDL Surfaces zum Austausch von Texturdaten.
  • GLB_DELPHI
    • Aktiviert die Unterstützung von Delphi TBitmaps zum Austausch von Texturdaten.
  • GLB_SDL_IMAGE
    • PNGs und JPEGs werden mit SDL_image geladen. Dabei wird GLB_SDL automatisch aktiviert und alle anderen Bibliotheken für PNG und JPEG deaktiviert. SDL_image unterstützt nur das Lesen von PNGs und JPEGs.
  • GLB_PNGIMAGE früher auch (pngimage)
    • Benutzt die Bibliothek PNGImage zum Lesen und Schreiben von PNGs. GLB_PNGIMAGE schließt GLB_LIB_PNG automatisch aus. Die Bibliothek PNGImage wurde mittlerweile von Codegear, für Delphi 2009, aufgekauft und darf nicht mehr zum freien Download angeboten werden. Entsprechend ist die originale Webseite nicht mehr verfügbar. Der Code wird vermutlich so direkt auch nicht Delphi 2009 funktionieren.
  • GLB_LIB_PNG
    • Benutzt die Referenzbibliothek libPNG zum Lesen und Schreiben von PNGs. Dabei werden unter Windows noch zwei zusätzliche DLLs benötigt.
  • GLB_DELPHI_JPEG
    • Benutzt die in Delphi eingebaute Implementation zum Lesen und Schreiben von JPEGs. GLB_DELPHI_JPEG schließt GLB_LIB_JPEG automatisch aus.
  • GLB_LIB_JPEG
    • Benutzt die Referenzbibliothek libJPEG zum Lesen und Schreiben von JPEGs. Dabei wird unter Windows noch eine zusätzliche DLL benötigt.

Download Header

Aktuelle Version: 2.0.3 (21-03-2010) (history)

Download glBitmap.zip (37 kb)

Je nach Konfiguration der Unit werden folgende Quellen benötigt:

 

Texturdateien öffnen

Hallo Steffen, erstmal ein großes Lob für deine Unit, ich verwende sie in meinen OpenGL-Projekten und bin echt zufrieden. Letztens tauchte ein Problem auf, wenn zwei Programme zufällig zur gleichen Zeit die selbe Datei öffnen wollten. Das Problem lag an der Art, wie deine Unit die Dateien öffnet. Ich habe in den Procedures LoadFromFile und AddAlphaFromFile die Zeile FS := TFileStream.Create(FileName, fmOpenRead); geändert in FS := TFileStream.Create(FileName, fmOpenRead OR fmShareDenyWrite); Danach konnten die Programme gleichzeitig auf die Datei zugreifen, sofern sie nur zum Lesen geöffnet wird. LG Florian

Hallo Florian, es freut mich,

Hallo Florian, es freut mich, dass es gefällt. Smile Vielen Dank für den Hinweis. Eventuell lasse ich das irgendwann noch mit einfließen. Alternativ dazu könnte man das jetzt auch schon (ohne Änderungen am Code) mit der Methode LoadFromStream realisieren. Dazu müsste man aber den FileStream per Hand erstellen und wieder freigeben. Was natürlich durch den Aufwand her ein wenig unpraktisch wäre. Dein Vorschlag ist da wohl deutlich sinnvoller.

Viele Grüße
Steffen

Kompatibilität zu Delphi 2009

Weil es damals Probleme mit den Neuerungen in Delphi 2009 gab (irgendwas mit Chars), habe ich in letzter Zeit die ziemlich veraltete Textures.pas benutzt. Wurden diese Kompatibilitätsprobleme inzwischen behoben oder wird das in absehbarer Zeit noch geschehen?

Da war doch was

Ich hatte irgendwann schon mal was in diese Richtung gemacht. Ich meinte das hätte bei mir sogar schon alles funktioniert. Aber so wie es scheint muss ich das Problem wohl aus den Augen verlohren haben. Wink Ich werde mich die Tage darum kümmern.