SDL sample texture: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Beispiel: Pascaltags)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
 
Zeile 11: Zeile 11:
 
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.
 
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.
  
<pascal>var
+
<source lang="pascal">var
 
  tex_surface : PSDL_Surface;
 
  tex_surface : PSDL_Surface;
  texture : gluInt;</pascal>
+
  texture : gluInt;</source>
  
 
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.
 
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.
  
<pascal> tex_surface := IMG_Load('./gfx/mytexture.jpg');
+
<source lang="pascal"> tex_surface := IMG_Load('./gfx/mytexture.jpg');
 
  if assigned(tex_surface) then
 
  if assigned(tex_surface) then
 
  begin
 
  begin
Zeile 26: Zeile 26:
 
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
   SDL_FreeSurface(tex_surface);
 
   SDL_FreeSurface(tex_surface);
  end;</pascal>
+
  end;</source>
 
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.
 
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.
  

Aktuelle Version vom 10. März 2009, 19:10 Uhr

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. Desweiteren ist z.B. bei TGA zu beachten, dass glTexImage2D den Paramater GL_BGR oder GL_BGRA übergeben werden muss, damit Rot und Blau nicht vertauscht sind. 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.