SDL sample texture: Unterschied zwischen den Versionen
(→Hinweise) |
(→Allgemein) |
||
Zeile 1: | Zeile 1: | ||
= Laden einer Texture mit SDL = | = Laden einer Texture mit SDL = | ||
== Allgemein == | == Allgemein == | ||
− | Einer der wohl interessantesten Fähigkeiten von [[SDL]] ist wohl die Tatsache, dass man [[SDL]] als Textur-Loader einsetzen kann. Gerade dann, wenn sowieso mit dem Gedanken gespielt wird sowohl für Windows als auch für Linux zu entwickeln, sollte man | + | Einer der wohl interessantesten Fähigkeiten von [[SDL]] ist wohl die Tatsache, dass man [[SDL]] mit Hilfe von [http://www.libsdl.org/projects/SDL_image/ SDL_Image] als Textur-Loader einsetzen kann. Gerade dann, wenn sowieso mit dem Gedanken gespielt wird sowohl für Windows als auch für Linux zu entwickeln, sollte man SDL_Image durchaus als Loader für die Texturen in betracht ziehen. |
== Beispiel == | == Beispiel == |
Version vom 28. Juli 2005, 11:21 Uhr
Inhaltsverzeichnis
Laden einer Texture mit SDL
Allgemein
Einer der wohl interessantesten Fähigkeiten von SDL ist wohl die Tatsache, dass man SDL mit Hilfe von SDL_Image als Textur-Loader einsetzen kann. Gerade dann, wenn sowieso mit dem Gedanken gespielt wird sowohl für Windows als auch für Linux zu entwickeln, sollte man SDL_Image durchaus als Loader für die Texturen in betracht ziehen.
Beispiel
Folgende Units müssen eingebunden sein, damit dieses Beispiel funktioniert:
- bevorzugte OpenGL-Header
- SDL.pas
- SDL_Image.pas
Neben den gewohnten Namen unter dem wir die Textur nach erfolgreichen Laden verwenden können, benötigen wir zudem noch einen Zeiger auf eine SDL-Surface. Diese wird normalerweise verwendet um mit SDL in 2D zu zeichnen. Uns interessiert hierbei allerdings die Surface selbst nicht, sondern nur die Daten, die sich nach dem Laden darin befinden.
var tex_surface : PSDL_Surface; texture : gluInt;
Der nächste Schritt sollte eigentlich jedem bekannt sein, der bereits eine Textur in OpenGL geladen hat. Zunächst erfolgt das Laden der Textur mittels der SDL-Funktion. Die Funktion IMG_Load wird automatisch erkennen um welches Dateiformat es sich handelt und sofern möglich diese Daten auf die Surface befördern. Diese beinhaltet dann alle relevanten Informationen, die wir brauchen um die Daten an OpenGL zu übergeben. Nachdem dies geschehen ist, sollten die Ressourcen, die von der Surface verwendet werden, wieder freigegeben werden.
tex_surface := IMG_Load('./gfx/mytexture.jpg'); if assigned(tex_surface) then begin glGenTextures(1, @texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_surface^.w, tex_surface^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex_surface^.pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); SDL_FreeSurface(tex_surface); end;
Mehr ist nicht nötig um mit SDL eine Textur zu laden. Im Vergleich zu anderen Loadern ist dieser Weg sicherlich nicht komplexer, zumal es sich natürlich anbietet den hier vorgestellten Code-Fetzen in einer eigenen Funktion oder gar einem Textur-Manager zu kapseln.
Hinweise
Beachtet, dass auch Bildformate mit Alpha Kanal unterstützt werden. SDL_Image lädt diesen automatisch mit und übergibt diesen auch an OpenGL. Sollte dieser also mitgenutzt werden, vergesst bitte nicht an glTexImage2D den Paramter GL_RGBA statt GL_RGB zu übergeben. Auch wird es anfangs eventuell verwundern, dass SDL_Image scheinbar die Texturen auf dem Kopf speichert. Um SDL_Image dieses Verhalten abzugewöhnen nutzt eine manipulierte Texture-Matrix oder speichert die Texturen mit einem Bildverarbeitungsprogramm gleich über Kopf.