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

Aktuelle Zeit: So Jul 13, 2025 15:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL|Fenstergrösse ändern|Texturen
BeitragVerfasst: So Feb 20, 2005 01:32 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Hi,
habe zwei Fragen zu SDL:
1. Wenn man die Fenstergrösse ändert "vergisst" das Programm die Texturen. Es wird notwendig diese neuzuladen.
So wird es auch in den Jedi-OpenGL-Demos von Nehe-Tutorials gemacht. Gibt es da eine einfachere Methode?

2. Beim Maximieren des Fenster wird es falsch maximiert. Breite und Höhe stimmen zwar. Das Fenster liegt aber an
sich schon die halber Höhe der Titelleiste zu hoch.

Wie initialisiere ich SDL?
Wie im Tutorial und ebenso wie es in Demos gemacht wird.

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 20, 2005 12:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Deine beschreibung klingt fast so, als würde man bei Resize einen neuen Rendercontext anlegen, und dadurch sind die Texturen dann weg. Wenn das so sein sollte kannste ja mal mit wglShareLists probieren die alten Texturen wieder verfügbar zu machen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 17:38 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Habe es jetzt mit der von dir beschriebenen Funktion ausprobiert.
Code:
  1. // Fenster-Größe hat sich verändert
  2.       SDL_VIDEORESIZE :
  3.         begin
  4.         DC:=wglGetCurrentContext;
  5.         surface := SDL_SetVideoMode( event.resize.w, event.resize.h, SCREEN_BPP, videoflags );
  6.         if ( surface = nil ) then
  7.           begin
  8.           Log.LogError('Surface bei Größenänderung verloren: '+SDL_GetError,'EVENT_RESIZE' );
  9.           Quit_App;
  10.           end;
  11.         nDC:=wglGetCurrentContext;
  12.         wglShareLists(DC,nDC);  
  13.         glResizeWindow( event.resize.w, event.resize.h );
  14.         end;

So sieht der Code aus. Funktioniert aber nicht, habe mich zwar nicht genauer damit auseinandergesetzt, weil es für mich aktuell nicht so wichtig ist,
aber ich vermute, dass ich so nicht an den Rendercontext drankomme.
Spätestens Sharelist meldet mir den Misserfolg.

Denoch Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 23:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du den Renderkontext nach dem Resizen verwendet, is der noch gültig? Also kannst du irgendwas mit OpenGL darauf ausgeben? Versuch mal direkt nach dem Resize die ClearColor umzustellen und dann den Bildschirm zu rendern. Wenn sich die Änderung bemerkbar macht, ist vielleicht nur das Sichtfenster seltsam verschoben.

Für die Technischen Sachen von OpenGL bin ich eigentlich net so der Guru. Aber eventuell sieht das einer von unseren Kennern und weiß mehr dazu.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 23, 2005 22:20 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Um ehrlich zu sein habe ich deine Frage nicht so ganz verstanden.

Habe jetzt einfach das Resize Event ignoriert, d.h. es auskommentiert.
OpenGL zeichnet denoch, nur halt verschoben wenn ich nicht glResizeWindows (was OpenGL die neuen Werte liefert) ausführe.
Die Texturen sind da. Das Fenster wird jetzt bei dem Wechsel in Vollbild auch richtig vergrössert.
Also irgendwo da muss der Hacken liegen, werde die Tage da noch mal nachschauen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 23, 2005 22:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hab gerade weiter oben deinen Code nochmal angeguckt. Öhm so meinte ich das net. Hohl dir mal den 2. DC nach dem Resizen. Und mach dann mal wglShareLists.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 16:45 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Flash hat geschrieben:
Hab gerade weiter oben deinen Code nochmal angeguckt. Öhm so meinte ich das net. Hohl dir mal den 2. DC nach dem Resizen. Und mach dann mal wglShareLists.

ähm, das mache ich doch schon, bzw. hatte ich am Anfang gemacht gehabt.
Die Funktion glResizeWindow passt nur den Viewport und die Perspective den neuen Verhältnissen an.
Mehr nicht.

Code:
  1. function glResizeWindow( width : integer; height : integer ) : Boolean;
  2. begin
  3. // Verhindern von \"Division by Zero\"
  4.   if (height = 0) then height := 1;
  5.  
  6.   // Viewport und Projektions-Matrix aktualisieren
  7.   glViewport(0, 0, width, height);
  8.  
  9.   glMatrixMode(GL_PROJECTION);
  10.     glLoadIdentity;
  11.     gluPerspective( 60.0, width / height, 1, 128 );
  12.   glMatrixMode(GL_MODELVIEW);
  13.  
  14.   // Rücksetzen der World-Matrix
  15.   glLoadIdentity;
  16.  
  17.   // Vorgang erfolgreich
  18.   result := true;
  19. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 19:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also oben in deinem Code führst du glResizeWindow nach dem wglShareLists aus. mach mal ShareLists danach. Eventuell wird innerhalb deines Resize irgendwas mit dem Fenster verbrochen, wodurch der Texturraum verloren geht.

Ich kenn mich mit SDL absoluto nicht aus :oops: , es wäre also günstig, wenn mal einer von unseren Pro's sich das mal anguckt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 22:11 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das hat leider auch nichts gebracht.
Übrigens bin ich darauf gekommen, dass ich die Surface denoch neuerstellen muss.
Ansonsten bekomme z.B. nur die Mausclicks die auf der "alten" Oberfläche gelandet sind.

Aber deine Meinung, dass der Hauptschuldige, der Täter dies in seinem Tutorial vergessen hat, sich hier mal melden könnte und sagt wie er das bei seinen Programmen löst.

@Phobeus
Deine Schrift wird hier gefordert :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 10:10 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Das liegt wohl daran, dass ich momentan ne wenig Probleme habe ein aktuelles Beispiel zu kompilieren und daher dein Problem nicht ganz nachvollziehen kann. Gerade was es angeht eine neue Surface zu erzeugen. Das sollte absolut nicht nötig sein. Das Fenster wird vom System verändert und man muss eigentlich nur darauf reagieren und zwar in der Form, dass man die Perspektive wieder entsprechend anpaßt.
Code:
  1.         // Fenster-Groesse hat sich veraendert
  2.         SDL_VIDEORESIZE :
  3.         begin
  4.              surface := SDL_SetVideoMode( event.resize.w, event.resize.h, SCREEN_BPP, videoflags );
  5.  
  6.              if ( surface = nil ) then
  7.              begin
  8.                   Writeln('Surface verloren');
  9.                   halt;
  10.              end;
  11.           glResizeWindow( event.resize.w, event.resize.h );
  12.         end;

Das dabei die Surface verloren geht ist eigentlich dabei eher unwahrscheinlich. Texturen und solche Dinge, sollte dabei eigentlich nicht verloren gehen. Danach die Perspektive ausrichten mit:
Code:
  1. function glResizeWindow( width : integer; height : integer ) : Boolean;
  2. begin
  3.      // Verhindern von \"Division by Zero\"
  4.      if ( height = 0 ) then height := 1;
  5.  
  6.      // Viewport und Projektions-Matrix aktualisieren
  7.      glViewport( 0, 0, width, height );
  8.  
  9.      glMatrixMode( GL_PROJECTION );
  10.        glLoadIdentity;
  11.        gluPerspective( 45.0, width / height, 0.1, 100.0 );
  12.      glMatrixMode( GL_MODELVIEW );
  13.  
  14.      // Rcksetzen der World-Matrix
  15.      glLoadIdentity;
  16.  
  17.      // Vorgang erfolgreich
  18.      result := true;
  19. end;
  20.  

Das hatte IMAO bei mir bisher zweifelsfrei funktioniert ohne das die Texturen verloren gegangen sind. Ich werde nochmal versuchen zu rekonstruieren, was Du machst, aber eigentlich sollte das Template-Beispiel funktionieren.

_________________
"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: Fr Feb 25, 2005 10:51 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Also habe es gerade zum laufen bekommen. Kann dein Problem auch während der Laufzeit nicht nachvollziehen. Beim resize des Fenster gehen Texturen nicht verloren und alles funktionert soweit prächtig. Bist Du Dir sicher, dass Du alles so machst wie im Template? Versuch das nochmal mit deinem Programm genau abzugleichen. Ansonsten würde ich eher ein wenig in den Voodoo-Bereich gehen. Längere Zeit geweigert die Treiber der Grafikkarte zu aktualisieren? ;-)

_________________
"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: Fr Feb 25, 2005 22:29 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Benutze die SDL-Template aus dem Downloadbereich (es sei denn ihr habt sie in den letzten Monaten geändert).
Dazu JediSDL in Version 1.0 und SDL 1.28

Hier sind die Änderungen in dem Template:
Code:
  1. uses Textures;
  2.  
  3. var Textur: GLUint;
  4.  
  5. procedure glDrawScene;
  6.   ...
  7.   glEnable(GL_TEXTURE_2D);
  8.   glBindTexture(GL_TEXTURE_2D,Textur);
  9.  
  10.   // Zeichne Dreieck
  11.   glBegin( GL_TRIANGLES );
  12.     glTexCoord2f(1/2,1);  glVertex3f( 0.0, 1.0, 0.0 );
  13.     glTexCoord2f(0,0);  glVertex3f( 1.0, -1.0, 0.0 );
  14.     glTexCoord2f(1,0);  glVertex3f( -1.0, -1.0, 0.0 );
  15.   glEnd;
  16. ...
  17.  
  18. //Hauptprogramm
  19. begin
  20.   Init_SDL;
  21.   Init_OpenGL;
  22.   Loadtexture('tex.jpg',Textur,false);
  23.   ...
  24. end;


Dann tritt beim Resizen der Fehler auf.

Grafikkartentreiber ist an sich aktuell, vorletzter ATI-Treiber.
Grafikkarte ebenfalls.

Edit: Die textures.pas ist die, die von SoS bearbeitet wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 26, 2005 10:35 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Das ist sehr merkwürdig. Das Template geht bei mir wunderbar. Ich verwende zum laden der Textur SDL_Image, allerdings fällt es mir irgendwie schwer zu glauben, dass dies der entscheidende Unterschied ist, wobei ich Dir natürlich den SDL-Loader ans Herz legen würde, wenn Du ohnehin bereits SDL nutzt. Das könnte dann in etwa so aussehen:
Code:
  1.  
  2. Var
  3.    surface: PSDL_Surface ;
  4.         tex : PSDL_Surface;
  5.         texture : gluInt;
  6. [...]
  7. procedure Init_Resource;
  8. begin
  9.         tex := IMG_Load('./figur.jpg');
  10.         if assigned(tex) then
  11.         begin
  12.                 WriteLn('Bind texture');
  13.                 WriteLn(tex^.w);
  14.                 WriteLn(tex^.h);
  15.  
  16.                  glGenTextures(1, @texture);
  17.         glBindTexture(GL_TEXTURE_2D, texture);
  18.  
  19.         glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  20.  
  21.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  22.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  23.  
  24.         //SDL_FreeSurface(tex);
  25.         end;
  26.  
  27.         glEnable(GL_TEXTURE_2D);
  28.    glBindTexture(GL_TEXTURE_2D,texture);
  29. end;
  30.  

Ansonsten habe ich keine guten Ideen zur Hand, weil ich es noch nie erlebt habe, dass durch das Verändern der Festergröße die Texturen verloren gehen. Du setzt im Template das RESIZE auf true und sobald Du dann die Fenstergröße veränderst verliert er die Texturen? Vielleicht könnte das dann auch nochmal ein anderer Windows-Nutzer machen? Außerdem stelle ich gerade fest, dass ich ältere SDL-Header einsetze. Kann mir kaum vorstellen, dass der Fehler aus der Richtung kommt, aber wer weiß O_o

_________________
"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: Sa Feb 26, 2005 13:08 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Also das mit dem SDL-Texturlader ist gut, dachte bis jetzt, dass es nur mit BMPs geht.
Am Texturlader den ich verwende liegt es leider auch nicht. Habe stattdessen mal Bmps und SDL-Loader genommen und es funktioniert ebenfalls nicht.

Ein weiterer suspekter Punkt für mich ist, dass ich das 10. Nehe-Tutorial das bei den Jedis dabei lag compileren kann ohne das der Fehler auftritt.
Und sie initialisieren und behandeln das Resizes genauso :(

Jedenfalls habe ich alle Units und das Programm selbst mal zusammengepackt und angehängt.
So könnte ihr dann genauer mal schauen wie es aussieht und müsst nicht rumraten.

[OT]Wie ich gerade sehe macht ihr Werbung für die Delphi-Tage. Ihr seit da dann auch anzutreffen? :roll:
So dass es sich wirklich lohnen würde da vorbeizukommen?[/OT]


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 28, 2005 17:28 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Update:
Nr.2 hat sich erledigt.
Update2:
Es lag an der SDL.dll Version 1.2.8. Mit der 1.2.4 die irgendwie in Windowsverzeichnis kam funktioniert es.

Das Problem mit den Texturen nach dem Resize habe ich aber immer noch, hat sich nicht verändert.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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 ]