Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:26

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL+OpenGL: Texturen
BeitragVerfasst: Mi Apr 08, 2009 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich versuche gerade Texturen zu laden. Verwendet wird SDL mit OpenGL. Das Problem dabei ist: Ich möchte einfach nur einen Button programmieren (eigentlich ist er das schon, aber nun muss er an OpenGL angepasst werden). Auf Basis seiner Statusvariable wird eine entsprechende Textur gezeichnet. Diese befindet sich in einer Matrix - die Positionen sind bekannt. Nun binde ich die Textur, aber wie unbinde ich sie wieder ? Der folgende kommentierte Code basiert auf SDL_Image. Das Laden klappt, das binden auch, nur am Unbind scheitert es noch. Der zweite Code ist die Render-Prozedur des Buttons. Ohne ein Unbind passiert aktuell bei einem Statuswechsel (zum Beispiel Maus drüber - ssOver) nichts. Es fehlt einfach das Unbind. Oder habt Ihr andere Vorschläge, wie man das lösen könnte ?
Code:
  1. type
  2.   // Textur
  3.   TTextur = class
  4.   private
  5.     Textur : GluInt;
  6.     function SetTexture(SDLSurface : PSDL_Surface; var Texture : TGluInt) : Boolean;
  7.     function LoadTexture(Dateiname : String; Textur : TGluInt) : Boolean;
  8.   public
  9.     constructor Create;
  10.     destructor Destroy; override;
  11.     procedure LoadFromFile(const Filename: String);
  12.     procedure LoadFromSurface(Surface: PSDL_Surface);
  13.     procedure Bind;
  14.     procedure Unbind;
  15.   end;
  16.  
  17. // Initialisierung
  18. constructor TTextur.Create;
  19. begin
  20.   Textur := 1;
  21. end;
  22.  
  23. // Freigabe
  24. destructor TTextur.Destroy;
  25. begin
  26.   Unbind;
  27. end;
  28.  
  29. // Textur laden
  30. procedure TTextur.LoadFromFile(const Filename: String);
  31. begin
  32.   LoadTexture(Filename, Textur);
  33. end;
  34.  
  35. // Surface zu Textur konvertieren
  36. procedure TTextur.LoadFromSurface(Surface: PSDL_Surface);
  37. begin
  38.   SetTexture(Surface, Textur);
  39. end;
  40.  
  41. // Textur an OpenGL binden
  42. procedure TTextur.Bind;
  43. begin
  44.   glEnable(GL_TEXTURE_2D);
  45.   glBindTexture(GL_TEXTURE_2D, Textur);
  46. end;
  47.  
  48. // Textur von OpenGL lösen
  49. procedure TTextur.Unbind;
  50. begin
  51.   //
  52. end;
  53.  
  54. // Textur nach OpenGL übertragen
  55. function TTextur.SetTexture(SDLSurface : PSDL_Surface; var Texture : TGluInt) : Boolean;
  56. begin
  57.   // Es ist nicht klar, ob die Funktion erfolgreich durchläuft.
  58.   Result := False;
  59.   if Assigned(SDLSurface) then
  60.   begin
  61.     glGenTextures(1, @Texture);
  62.     glBindTexture(GL_TEXTURE_2D, Texture);
  63.     // Die Größen werden automatisch berechnet. Sonst wären nur Potenzen von 2 möglich (16x16, 32x32, usw.) möglich.
  64.     if SDLSurface.format.BytesPerPixel > 3 then
  65.       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SDLSurface^.w, SDLSurface^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, SDLSurface^.pixels)
  66.     else
  67.       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB , SDLSurface^.w, SDLSurface^.h, 0, GL_RGB , GL_UNSIGNED_BYTE, SDLSurface^.pixels);
  68.       // Textureigenschaften setzen
  69.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  70.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  71.     // Mipmaps generieren
  72.     if SDLSurface.format.BytesPerPixel > 3 then
  73.       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, SDLSurface^.w, SDLSurface^.h, GL_RGBA, GL_UNSIGNED_BYTE, SDLSurface^.pixels)
  74.     else
  75.       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB , SDLSurface^.w, SDLSurface^.h, GL_RGB , GL_UNSIGNED_BYTE, SDLSurface^.pixels);
  76.     // Freigabe
  77.     SDL_FreeSurface(SDLSurface);
  78.     // Keine Fehler
  79.     Result := True;
  80.   end;
  81. end;
  82.  
  83. // Textur laden
  84. function TTextur.LoadTexture(Dateiname : String; Textur : TGluInt) : Boolean;
  85. var Surface : PSDL_Surface;
  86. begin
  87.   Result  := False;
  88.   Surface := IMG_Load(PChar(Dateiname));
  89.   Result  := SetTexture(Surface, Textur);
  90. end;

Code:
  1. type
  2.   // Skingrafiken
  3.   TSkinSchema = Array[0..3] of Array[0..3] of TTextur;
  4.  
  5. // Zeichnen
  6. procedure TSkinButton.Draw;
  7.   procedure DrawQuad(pX, pY, pW, pH, pZ: Single);
  8.   begin
  9.     glBegin(GL_QUADS);
  10.       glTexCoord2f(1, 0);
  11.       glVertex3f(pX+pW, pY   , -pZ);
  12.       glTexCoord2f(0, 0);
  13.       glVertex3f(pX   , pY   , -pZ);
  14.       glTexCoord2f(0, 1);
  15.       glVertex3f(pX   , pY+pH, -pZ);
  16.       glTexCoord2f(1, 1);
  17.       glVertex3f(pX+pW, pY+pH, -pZ);
  18.     glEnd;
  19.   end;
  20. var SchriftFarbe   : TSDL_Color;
  21.     SchriftSurface : PSDL_Surface;
  22.     Schrift        : TTextur;
  23. begin
  24.   // Texturen abhängig von Status zuweisen
  25.   // Normal
  26.   if Status = ssNormal then
  27.     Schema[0][0].Bind
  28.   else
  29.   // Drüber
  30.   if Status = ssOver then
  31.     Schema[1][0].Bind
  32.   else
  33.   // Gedrückt
  34.   if Status = ssDown then
  35.     Schema[2][0].Bind;
  36.   // Zeichnen
  37.   // Rechteck
  38.   DrawQuad(Left, Top, Width, Height, 0);
  39. end;
  40.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 10, 2009 19:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du benötigst, jedenfalls soweit ich dich jetzt verstanden habe, immer eine Textur.

Wenn du eine andere anzeigen willst, die erscheint wenn die Maus drüber schwebt, dann musst du die standard Textur einfach in dem Moment wieder setzen, wenn die Maus den Button wieder verlässt.

Die nachfolgenden anderen Teile der Szene werden vermutlich andere Texturen benötigen (außer es besteht alles aus Buttons ;) ) dann musst du die entsprechend binden. Und wenn du keine Textur mehr benötigst dann schaltest du mit glDisable(GL_TEXTURE_2D) das ganze einfach aus.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 21:12 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Oder du bindest einfach 0 an das entsprechende Ziel. Aber warum unbinden? Eigentlich musst du doch nur irgendwo eine andere Textur binden, oder zeichnest du etwas ohne Texturen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 12:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Stimmt, einfach neu binden und fertig. Aber etwas anderes was zum gleichen Thema gehört wäre da noch: Wenn man einen Text in einem SDL-Surface gerendert hat, gibt es dann noch bessere Möglichkeiten außer Blending, um das Surface als Textur konvertiert über die Button-Textur zu blenden ? Denn im Folgenden geht leider leicht die Leserlichkeit verloren. Es wäre zwar noch hinnehmbar, aber der Text könnte - falls möglich - noch etwas schärfer sein.
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist die falsche Blend-Funktion. Die die du da hast ist Additiv, das ist bei Text nicht angebracht. Versuch mal diese:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 20:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Sieht aber doch noch recht verschwommen aus.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]