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

Aktuelle Zeit: So Jul 06, 2025 23:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Verschiedene Texturen??
BeitragVerfasst: Sa Jan 05, 2008 20:11 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Ich habe hier einen Quelltextauszug der einen Würfel zeichnet und alle 8 Seiten mit einer Textur belegt, nämlich der gleichen. Wie bekomme ich es hin, dass ich jeder Seite eine andere Textur zuweise?
Hat das was mit TexID zu tun?
Und wie kann ich die Texturen "nach innen" kehren sodass sozusagen ein Raum aus dem Würfel wird?
Code:
  1.  
  2. procedure Tgame.TBlock.Draw(x,y,z,width,height,r,g,b : real);
  3. var i :integer;
  4. begin
  5. height:=height*1.5;
  6. for I := 0 to 1 do        // roof and floor
  7. begin
  8.   glBegin(GL_QUADS);
  9.    glcolor3f(r,g,b);
  10.    glTexCoord2f(0,0); glVertex3f(x, y-i*height, z);
  11.    glTexCoord2f(1,0); glVertex3f(x+width, y-i*height , z);
  12.    glTexCoord2f(1,1); glVertex3f(x+width, y-i*height, z+width);
  13.    glTexCoord2f(0,1); glVertex3f(x, y-i*height, z+width);
  14.   glEnd;
  15. end;
  16. for I := 0 to 1 do        // walls a
  17. begin
  18.   glBegin(GL_QUADS);
  19.    glcolor3f(r,g,b);
  20.    glTexCoord2f(0,0); glVertex3f(x+I*width, y, z);
  21.    glTexCoord2f(1,0); glVertex3f(x+I*width, y, z+width);
  22.    glTexCoord2f(1,1); glVertex3f(x+I*width, y-height, z+width);
  23.    glTexCoord2f(0,1); glVertex3f(x+I*width, y-height, z);
  24.   glEnd;
  25. end;
  26. for I := 0 to 1 do        // walls b
  27. begin
  28.   glBegin(GL_QUADS);
  29.    glcolor3f(r,g,b);
  30.    glTexCoord2f(0,0); glVertex3f(x, y, z+i*width);
  31.    glTexCoord2f(1,0); glVertex3f(x+width, y, z+i*width);
  32.    glTexCoord2f(1,1); glVertex3f(x+width, y-height, z+i*width);
  33.    glTexCoord2f(0,1); glVertex3f(x, y-height, z+i*width);
  34.   glEnd;
  35. end;
  36. end;
  37. procedure TGame.Textureload;
  38. var
  39.   tex   : PSDL_Surface;
  40.  
  41. begin
  42.   tex := IMG_Load('./woodbox.jpg');
  43.   if assigned(tex) then
  44.   begin
  45.     glGenTextures(1, @TexID);
  46.     glBindTexture(GL_TEXTURE_2D, TexID);
  47.  
  48.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  49.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  50.  
  51.     // Achtung! Einige Bildformate erwarten statt GL_RGB, GL_BGR. Diese Konstante fehlt in den Standard-Headern
  52.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  53.  
  54.     SDL_FreeSurface(tex);
  55.   end;
  56. end;
  57.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 05, 2008 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
für das "nach innen kehren" musst du die reihenfolge, in der du die Punkte angibst, umdrehen (siehe auch glCullFace).

Um jeder seite eine andere textur zuzuweisen, musst du vor dem passenden glBegin auch noch ein glBindTexture aufrufen, mit dem ersten Parameter GL_TEXTURE_2D und dem zweiten dann die ID deiner Textur, die du von glGenTextures geholt hast.

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: Sa Jan 05, 2008 21:10 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Perfekt! Vielen Dank!

Hmm das klappt nur nicht ganz mit dem nach innen kehren, wie genau muss ich die Reihenfolge ändern?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 05, 2008 22:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Vorderseite, also die sichtbare Seite einer Fläche wird anhand der Reihenfolge der angebenen Punkte bestimmt.

Die Vorderseite ist diejenige Seite, bei der man, wenn man sie Betrachtet, die Punkte gegen den Uhrzeigersinn sieht. Der Anhang stellt also eine Vorderseite dar.

Wenn du nun eine Primitive, also z.B. dein Quad umdrehen willst, so musst du den letzten Aufruf von glVertex an den Anfang packen, den ersten ans ende und die beiden mittleren vertauschen.
Also aus
Code:
  1.  
  2. glTexCoord2f(0,0); glVertex3f(x, y-i*height, z);
  3. glTexCoord2f(1,0); glVertex3f(x+width, y-i*height , z);
  4. glTexCoord2f(1,1); glVertex3f(x+width, y-i*height, z+width);
  5. glTexCoord2f(0,1); glVertex3f(x, y-i*height, z+width);
  6.  

wird
Code:
  1.  
  2. glTexCoord2f(0,1); glVertex3f(x, y-i*height, z+width);
  3. glTexCoord2f(1,1); glVertex3f(x+width, y-i*height, z+width);
  4. glTexCoord2f(1,0); glVertex3f(x+width, y-i*height , z);
  5. glTexCoord2f(0,0); glVertex3f(x, y-i*height, z);
  6.  


Eventuell solltest du die Texturkoordinaten nicht mitnehmen, also deren Reihenfolge nicht ändern, aber das musst du anhand deiner Szene entscheiden.

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: So Jan 06, 2008 09:14 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Jetziges Problem ist das er irgentwie für den gesammten würfel textur 5 und 6 benutzt, aber nicht 1,2,3,4.
Code:
  1.  
  2. procedure Ttest.Button1Click(Sender: TObject);
  3. var i :integer;
  4. begin
  5. inc(r,1);
  6. for i := 1 to 6 do Block[r].Txsides[i]:=Pchar('./res\woodbox'+inttostr(i)+'.JPG');
  7. Block[r].Textureload;
  8. end;
  9.  
  10. ...
  11.  
  12.  
  13. procedure TGame.TBlock.Textureload;
  14. var
  15.   tex   : PSDL_Surface;
  16.   i : integer;
  17. begin
  18. for i := 1 to 6 do
  19.  begin
  20.   tex := IMG_Load(Txsides[i]); // <------- Hier wird der Pfad aus dem array dann benutzt
  21.   if assigned(tex) then
  22.   begin
  23.     glBindTexture(GL_TEXTURE_2D, i);
  24.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  25.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  26.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  27.     SDL_FreeSurface(tex);
  28.   end;
  29. end;
  30.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 06, 2008 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du solltest deine pChar Behandlung umstellen. Die Delphi Strings haben eine unsichtbare Referenzzählung. pChar hingegen hat so etwas nicht. Wenn du jetzt einen String dynamisch zusammen baust dann existiert dieser nur Temporär. Wenn du dir eine Variable vom Typ String irgendwo speicherst dann behält Delphi diesen String, da die Referenzzählung verhindert, dass er gelöscht wird. Wenn du ihm aber direkt als pChar castest, dann geht er davon aus, dass der String nicht mehr benutzt wird und schmeißt ihn anschließend sofort wieder weg.

Das was du machen musst ist die Behandlung der Texte komplett auf String umstellen. Und nur dann wenn du den String als pChar benötigst solltest du ihn casten. Also Block.Txsides sollte ein String sein und erst bei IMG_Load castest du ihn als pChar. Ansonsten müsstest du dich selber um die Verwaltung der pChars kümmern. Also anlegen, befüllen und dann selber wieder frei geben. Und da sind Strings um ein vielfaches einfacher. ;)

Wenn du dir das mal im Debugger anschaust sollten bereits in Zeile 7 deine ersten 5 Strings falsch sein. Wenn du zwischen der Zeile 6 und 7 noch einen String anlegen würdest, dann stünde die Chance sehr gut, dass Delphi den Speicherbereich deiner Strings überschreiben würde. Denn obwohl an den Adressen sich derzeit noch die "richtigen" Daten befinden sind die Bereiche wieder als Frei markiert und können belegt werden. Das es nicht zu Zugriffsverletzungen oder kryptischen Dateinamen kommt liegt nur daran, dass der Zeitabstand dazwischen günstig ist.


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 » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]