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

Aktuelle Zeit: Do Jul 10, 2025 12:31

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Frage zum Laden von Texturen
BeitragVerfasst: Sa Nov 01, 2008 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Hey
Ich hab hier wiedermal eine relativ kleine Frage:
Und zwar ergibt sich bei mir beim Texturen laden ein Problem nämlich dass der Befehl glBindTexture();
für die Texture ID das Format Cardinal verlangt und der Befehl zum löschen der Textur glDeleteTextures(); das Format PGLuint .
Da ich aber beides brauche weiß ich nicht weiter.
Könnte mir da jemand vielleicht einen Tipp geben?
LG


Hier ist meine gesamte Texturen-lade Procedure:
Code:
  1.  
  2. procedure TForm1.Texturen;     //Texturen erstellen
  3.  var
  4.   tex : PSDL_Surface;
  5.          TexID <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\" /><!-- s:P -->GLuint;
  6.  
  7. begin
  8.   tex := IMG_Load('./wiki.jpg');
  9.   if assigned(tex) then
  10.   begin
  11.     glGenTextures(1, @TexID);
  12.     glBindTexture(GL_TEXTURE_2D, TexID);  {<--- Hier tritt der Fehler auf!}
  13.  
  14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  16.  
  17.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  18.  
  19.     SDL_FreeSurface(tex);
  20.   end;
  21.    glDeleteTextures(1,@TexID);
  22.  
  23. end;
  24.  

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2008 19:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
glGenTextures(1, @TexID); <- ist ein Pointer auf einen Pointer.
TexID muss einfach vom Typ Cardinal bzw. TGLuint sein.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Und was heißt das dann was ich verändern müsste ?
Ich kenn mich leider überhaupt nicht mit Pointern und so aus deshalb weiß ich jetz nich so genau was ich da ändern muss :(

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

deklariere die TexID als Tgluint und schreibe
glGenTextures(1, @TexID); und
glBindTexture(GL_TEXTURE_2D, TexID);

Das @ macht aus dem Tgluint ein Pgluint.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Ahhh ok vielen Dank das funktioniert :)
Den Befehl glDeleteTextures(1,@TexID); darf man doch auch in die Render Procedure schreiben oder?

Als ich das jetzt mit dem TGluint gemacht hatte warn nämlich auf einmal meine Texturen weiß. (solange ich glDeleteTextures(1,@TexID); noch in der Texturen Procedure hatte).
Wenn ich das in die Render Procedure schreibe dann sieht man sie aber wieder. Ich hoffe ma dass das jetz kein Fehler is?

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 10:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

die Textur solltest du erst beim beenden deines Programms löschen. Wenn du glDeleteTextures aufrufst wird sie nämlich gelöscht, und das willst du ja nicht, oder?

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 10:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Pointer: Pointer sind Variablen die eine Adresse auf eine Speicherstelle einhalten. Im Falle von glGenTextures werden Pointer dazu benutzt um die ID einer von OpenGL erstellten Textur zurückgeben zu können. Wenn du die Variable bereits als PGLuint deklarierst, dann zeigt der Pointer auf keinen gültigen Speicherbereich und Zugriffe darauf laufen ins Nirvana oder irgend woander hin. Dazu gibt es den @ Operator. Der liefert die Adresse einer Speichervariable zurück. Und die kann OpenGL dann dazu verwenden um die ID der Textur abzulegen.

Die Texturen sollten für den Anfang zu mindest nur außerhalb des Rendern laden. Du musst dann aber darauf achten, dass du die TexturID irgendwo ablegst wo du später auch noch darauf zugreifen kannst. Typischerweise werden die Texturen nach dem Initialisieren geladen und später werden die Texturen nur noch gebunden und aktiviert.

glDeleteTextures direkt nach dem Laden der Texturen aufzurufen ist nicht so praktisch. Denn damit löscht du deine Texturen augenblicklich wieder. Was aber vermutlich eher nicht ganz Sinn und Zweck ist. glDeleteTextures solltest du erst dann aufrufen, wenn du die Textur ganz gewiss nicht mehr brauchst. Entsprechen brauchst du die Texturen auch nur ein einziges Mal laden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 11:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Ja da sprecht ihr gleich das nächste Thema an mit dem ich Probleme hab.
Ich weiß zwar dass man die Texturen eigentlich beim Initialisieren laden sollte und dann in Hashlisten oder so ablegen .
Allerdings hab ich noch nie mit Hashlisten gearbeitet (ich weiß nur so ungefähr wie sie funktionieren).
Wenn ihr mir vielleicht sagen könntet wie man so eine Hashliste überhaupt erstellt und wie man da die Texturen drin ablegen kann und so das wär super :)

Ach ja und was ich mich schon lange frage:
Wie kann man diese abgelegten Texturen denn dann überhaupt in der Render Procedure wieder aufrufen?

PS: Danke schön schonmal für eure Antworten bis jetzt :)

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Eine Hashliste, Hashmap oder auch assoziatives Array (Je nach Programmiersprache) ist eigentlich nichts weiter als eine Art Tabelle mit einer Key <-> Object Beziehung.
Ein Key darf genau einmal dadrin vorkommen z.B. eindeutige Nummern oder Strings ( z.B. Texturnamen wie sky_1.tga) als Objekt kann man eigentlich alles nehmen was es so gibt, diese dürfen auch mehrmals vorkommen aber mit verschiedenen Keys. Wenn man nun auf die Daten zugreifen will, aber nur den Texturnamen hat, sucht man nach genau diesem, welcher als Key gespeichert wurde und bekommt als Rückgabewert die Texturid oder die Textur je nachdem ^^ Diese Id kann man dann mit
Code:
  1.  
  2. glEnable(GL_TEXTURE_2D);
  3. glBindTexture(GL_TEXTURE_2D, deinetexturid);
  4.  

binden.
Aber nicht vergessen
Code:
  1. glBindTexture(GL_TEXTURE_2D, 0);
  2. glDisable(GL_TEXTURE_2D);

aufzurufen, wenn die Textur nicht mehr benutzt wird, ansonsten bleibt sie für nachfolgende Dreiecke etc. bestehen und verfälscht eventuell Farben usw.

Die Hashlisten sind auch schneller, als wenn man eine verkette Liste von vorne nach hinten druchgehen müsste und jedes Objekt selber indentifizieren müsste.
Wie das genau in Delphi geht weiß ich leider nicht.

hoffe das hat ein bisschen geholfen ertsmal mfg ^^

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 14:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich hatte mal eine Unit mit 2 Klassen für Hashs geschrieben. Mit der kannst du String <> Pointer Paare und Integer <> Pointerabspeichern.

Allerdings wie du die Sachen abspeicherst ist dir vollkommen dir überlassen. In Programmen mit dynamischem Inhalt ist es meistens nur so, dass diese über Namen angesprochen werden müssen. Und dann wirst du um einen Hash kaum herum kommen. Wobei


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
OK also wenn ich das jetzt richtig verstanden habe könnte man für den Anfang so eine Hashliste auch durch ein einfaches Array z.B. ersetzten oder?

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 16:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

ja, kannst du. Die Hashliste dient halt nur dazu, Texturen über einen eindeutigen Key anzusprechen.
Für den Anfang reicht sicherlich ein array of Tgluint aus. Du musst nur selbst wissen, welche Textur jetzt wo im Array ist.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 16:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
OK vielen Dank :)

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2008 19:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wenn du nur 2-3 Texturen fest in deinem Programm hast, dann kannst du auch einfache Variablen dafür verwenden. Das Sschöne am Programmieren ist ja, dass du es so machen kannst wie du es haben willst. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 10:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Jaa stimmt :D
aber es sollten schon so 10 -20 Texturen werden da nehm ich lieber arrays :)

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]