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

Aktuelle Zeit: Di Jul 08, 2025 16:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen SDL <-> glBitmap
BeitragVerfasst: Mi Aug 23, 2006 08:56 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Habe jetz im Tut4 mir die Texturenbearbeitung mit SDl angesehen, finde aber (vllt lieg ich ja falsch ;) ), dass es ueber glBitmap einfacher geht.
Statt also: (Quote aus http://wiki.delphigl.com/index.php/Tuto ... n_besorgen )
Code:
  1. var
  2.   tex : PSDL_Surface;
  3. begin
  4.   tex := IMG_Load('./wiki.jpg');
  5.   if assigned(tex) then
  6.   begin    
  7.     glGenTextures(1, @TexID);
  8.     glBindTexture(GL_TEXTURE_2D, TexID);
  9.        
  10.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  11.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  12.        
  13.     // Achtung! Einige Bildformate erwarten statt GL_RGB, GL_BGR. Diese Konstante fehlt in den Standard-Headern
  14.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  15.  
  16.     SDL_FreeSurface(tex);
  17.   end;


habe ich mich ein bissel im Artikel http://wiki.delphigl.com/index.php/Glbitmap_loader umgesehen und nutze statt sdl jetz:
Code:
  1. procedure TForm1.InitTextures();
  2. begin
  3.   Texture := TglBitmap2D.Create; // Instanz der Klasse erstellen
  4.   Texture.LoadFromFile('texture\Wall.bmp'); // Datei laden
  5.   Texture.GenTexture; // geladene Textur an OpenGL übergeben
  6. end;


und dann im render:
Code:
  1.  
  2. procedure TForm1.Render();
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity;
  8.   gluPerspective(100.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  9.  
  10.   glMatrixMode(GL_MODELVIEW);
  11.  
  12.   glLoadIdentity();
  13.   glTranslatef(0,0,-10);
  14.   InitTextures();
  15.   glBegin(GL_QUADS);
  16.     glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  17.     glTexCoord2f(0,1); glVertex3f(-1,1,0);
  18.     glTexCoord2f(1,1); glVertex3f(1,1,0);
  19.     glTexCoord2f(1,0); glVertex3f(1,-1,0);
  20.   glEnd;
  21.   SwapBuffers(DC);
  22. end;


Leider bleibt mein Quadrat weiß...

Ich habe zu jedem Befehl, den ich hier aus glBitmap verwende, ein Äquivalent aus SDl gefunden, nur bei einem nicht:
In SDL gibt es: glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);, das laut dem Tut auch die Bildinformationen an OpenGL uebertraegt. Allerdings weiß ich nicht, wie dazu die Funktion in der glBitmap ist? Oder versteh ich grad was völlig falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 09:25 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Einfachheit läßt sich i.d.R. nicht über die länge eines Codes bestimmen ... ;) Letztendlich also eine Frage der Zielsetzung und des Geschmackes und glBitmap wäre gewiss nicht in der SDK, wenn wir es für schlecht hielten ;)

Ich selbst arbeite jedoch nicht damit. Aber vermisse in deinem Code auf jeden Fall das binden der Textur. Dafür stelle ich schockiert fest, dass Du bei jedem Frame (!!!) die Textur neu von der Festplatte lädst. Das ist so wie ne Porsche vor nem Pflug zu stellen und damit versuchen Ackerwirtschaft zu betreiben. Die Grafikkarte heult kurz auf, leistet aber wohl nichts, solange die Festplatte langsam vor sich hier schrappt. Initalisiere deine Texturen nur ein einziges Mal nach OpenGL (ggf. SDL) und binde die Texturen lediglich in der Render-Loop, wenn diese benötigt werden.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 09:34 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Juhu danke es geht ;)
Ich hatte Bind zwar vorher schonmal drin, aber da ging es irgendwie nich. InitTexture ist im Oncreate und alles is va béné :D

*in euphorischer stimmung schwelg* Ach bin ich froh, dass ich diese Seite gefunden habe *freu*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 10:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich kann Phobeus nur zustimmen. Es kommt immer ganz darauf an was du machen möchtest. So lange du nur Windowsprogramme schreiben möchtest dürfte derzeit die glBitmap wohl die einfachste Alternative sein. Sobald du aber für Linux oder einfach nur Platformunabhängig programmieren möchtest solltest du die glBitmap nicht verwenden. Über kurz oder lang wird sich da auch noch etwas tun. Das aber eher lang als kurz. ;-)

Und sonst würde ich SDL und die glBitmap nicht direkt ins Verhältniss setzen. die glBitmap ist eine Wrapperklasse die sich mehr oder weniger um alles selber kümmert. SDL hingegen ist aber eine Platformunabhängige Schnittstelle. SDL übernimmt dir im Falle des Tutorials nur das Laden des Bildes. Was du dann aber mit deinen Texturdaten anstellst ist allein deine Sache. Im Tutorial wird daraus eine OpenGL Textur erstellt. Die glBitmap hingegen existiert nur zu dem Zweck des Texturenerstellens. Deswegen sind dort viele Vorgänge zu einer Methode zusammengefasst worden. Und beim SDL Weg musst du selber dafür aber wiederrum die passenden OpenGL Methoden aufrufen. Wenn du mal in der glBitmap suchst wirst du auch genau die Methoden finden die auch beim SDL Weg benutzt werden. Also alle denen ein gl vorn angestellt ist. ;-)

Also in dem Sinne ist die glBitmap spezialisierter und SDL flexibler. Und man kann diese beiden nur sehr bedingt miteinander vergleichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 13:25 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Jo gut, dann denke ich, bleibe ich doch vorher noch ein bissel bei glBitmaps ^^

Aber ein anderes Problemchen hab ich wieder:
Mit hilfe der Quellcodes aus dem Downloadbereich arbeite ich gerade das Tut 4 durch und habe beim Terrainrendern ein problem:

Code:
  1. procedure TForm1.InitTextures();
  2. var x,y:Integer;
  3. begin
  4.   Texture := TglBitmap2D.Create; // Instanz der Klasse erstellen
  5.   Texture.LoadFromFile('texture\wall.bmp'); // Datei laden
  6.   Texture.GenTexture; // geladene Textur an OpenGL übergeben
  7.   Texture.Bind();
  8.  
  9.   randomize;
  10.   for x:=0 to Width do
  11.     for y:=0 to Height do
  12.       Map[x,y]:=0.01*Random(5);
  13.  
  14. end;


Dieser Code bringt mir einen Zugriffsfehler. Sobald ich die Mapzuweisung rausnehme, geht alles ganz vabéne, dabei habe ich es theoretisch ja in etwas genauso wie im Beispiel.
Ideen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Erst mal noch eine Kleinigkeit zu der Textur. In GenTexture wird bereits ein Bind aufgerufen. Du musst das dahinter nicht noch ein Mal aufrufen. Normal wird das Bind eher dort aufgerufen wo du die Textur verwenden möchtest. Also unmittelbar Vorher versteht sich.

Zu der Zugriffsverletzung. Da denke ich mal, dass die Definition deiner Map nicht stimmt bzw. du einen zu großen Bereich ansteuern möchtest. 0 bis Width sieht für mich nämlich auch ganz danach aus. Sagen wir mal Width wäre 512 so bräuchtest du 513 Felder in deiner Map. Das gleiche gilt für die Höhe. Dann sollte normal schon ein Width -1 und Height -1 ausreichen. Aber zur Sicherheit poste mal bitte die Deklaration deiner Map.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 13:47 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Jo nur Height und Width sind Constanten:
Code:
  1. const NearClipping=1;
  2.       FarClipping=1000;
  3.       Width=30;
  4.       Height=10;
  5.  
  6. var  MAP : array[0..WIDTH+1,0..HEIGHT+1] of single;


Und nicht ScreenHeight/ScreenWidth oder ClientHeight/ClientWidth oder so. In nem Bereich bis 30 sollte das ja eigentlich gehen


Edit: Habe mal Height und Width an allen Stellen zum Test zu xHeight und xWidth gemacht udn schon gings. Ich dachte mir ja schon, dass die beiden reserviert sind, aber im Beispiel wurden die auch einfach so benutzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 23, 2006 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ne nicht reserviert. Aber die Namen existieren schon. Und zwar benutzt du ja ein Delphi-Formular. Die haben natürlich Eigenschaften die genau so heißen. Und da hat der Compiler diesen den Vorzug gegeben. ;-)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.008s | 16 Queries | GZIP : On ]