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

Aktuelle Zeit: So Mai 19, 2024 13:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Jan 05, 2005 11:44 
Offline
DGL Member

Registriert: Di Dez 21, 2004 20:39
Beiträge: 20
Hi !

Wie schonmal erwähnt, versuche ich mich in der nonVCL programmieren von OpenGl,
mit NeHe's Framework.
Das Funktioniert alles wunderbar.

Sobald ich jetzt die dglOpenGl einbinde und wie in der HTML Datei beschrieben initialisiere,
kommt es immer dann beim ausführen der EXE zu einer EACCESSVIOLATION in module at 00000000,
wenn ich direkt beim starten in den Vollbildmodus switchen möchte.

Wenn ich erst im Fenstermodus starte und dann in den Vollbildmodus wechsel, kommt es zu keinem Fehler.
Dementsprechend müsste der Fehler ja irgendwo in meiner Initialisierung in den Vollbildmodus liegen, ich finde
meinen Fehler allerdings nicht (habt ihr euch schon gedacht, hu ? ^^)

In Anhang die leere DPR die nur mit dglOpenGL initialisiert wird... :cry:


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 05, 2005 11:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Also...hm..bei mir funktionierts wunderbar. Würde mal auf fehlerhafte/alte Treiber tippen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 05, 2005 12:24 
Offline
DGL Member

Registriert: Di Dez 21, 2004 20:39
Beiträge: 20
hm...Möglich wärs...ich programmiere auf einem Notebook...
Ich schau mal...erstmal danke für deine Antwort ;)

thx


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 05, 2005 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ne nicht wirklich. Deine Treiber sind okay. Es ist nur Zufall, dass der Fehler nicht auch im Fenstermodus auftritt.

In der Methode CreateGLWindow wird die API Funktion CreateWindowEx aufgerufen. Im Vollbildmodus wird dabei aber ein WM_SIZE an das Fenster gesendet. Das wiederum will dann den OpenGL Viewport aktualiseren. So weit ist das auch richtig. Nur existiert der zu dem Zeitpunkt noch gar nicht und somit wurden die Funktionspointer von OpenGL auch noch nicht geladen (in ActivateRenderContext). Und das führt dazu, dass er Methoden mit einer Adresse von nil aufrufen möchte. Das geht dann natürlich schief.

Um dieses Problem zu beheben musst du ein globales Boolean erstellen in dem du speicherst ob OpenGL initialisiert wurde oder eben nicht. In der Methode CreateGlWindow vor dem Aufruf von ReSizeGLScene setzt du dieses auf True. Am Besten überprüfst du dann in der Methode ReSizeGLScene ob das Boolean gesetzt ist. Wenn nicht darf er logischerweise nichts mit OpenGL aufrufen. Dann sollte es gehen.

PS: Du solltest dich mal mit deinem Debugger vertraut machen. Der kann bei solchen Problemen echt nützlich sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 05, 2005 13:07 
Offline
DGL Member

Registriert: Di Dez 21, 2004 20:39
Beiträge: 20
Danke ! Jetzt funktioniert es wieder !!

Und in der Tat, mit dem Debugger habe ich mich bis jetzt recht wenig beschäftigt !
ich werde dem debugging in Zukunft mehr Aufmerksamkeit widmen !!

Nochmals danke... :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 05, 2005 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Delphic hat dazu ein interessantes Tutorial geschrieben. Kann ich dir nur mal wärmstens ans Herz legen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 07:31 
Offline
DGL Member

Registriert: Mo Aug 02, 2004 18:01
Beiträge: 12
Moin !

Bei mir tritt auch ein Problem mit dem Fullscreen Modus auf:

Der Fullscreen Modus ist nur noch ein Ausschnitt des Desktops, die Auflösung wird nicht mehr richtig geändert.. :(

Weis jemand woran das liegen könnte ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 08:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke mal, dass bei dir der Aufruf von ChangeDisplaySettings schief geht. Allerdings kann man das nicht genau sagen, da deine Beschreibung mehr als dürftig ist.

Wie sieht der der "Ausschnitt" aus? Ändert sich die Auflösung? Ändert sich die Monitorfrequenz? Was liefert ChangeDisplaySettings zurück? Wie wäre es mit ein paar Codeschnippseln!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: komischer fullscreen modus
BeitragVerfasst: Di Jan 11, 2005 09:00 
Offline
DGL Member

Registriert: Mo Aug 02, 2004 18:01
Beiträge: 12
Ich versuche die 2.Nehe Lektion für Delphi mit Freepascal zu kompilieren.
http://nehe.gamedev.net/data/lessons/delphi/lesson02.zip
Mit Delphi compiliert funktioniert es einwandfrei.

Beim ausführen bleibt die Desktop-Auflösung(1024x768) erhalten, obwohl OpenGL 640x480 im Fullscreenmodus initialisiert. Links oben ist ein schwarzes Rechteck mit der OpenGL Ausgabe; kein Fensterrahmen; nur ist der halbe Desktop noch zu sehen.. !
Wahrscheinlich liegt es an den furchtbar alten OpenGL Units die bei Freepascal mit dabei sind.

Code:
  1.  // Uses Windows, Messages, OpenGL, GLaux;
  2. Uses Windows, Messages, GL, Glu; // <-

Code:
  1. procedure KillGLWindow;
  2. CONST pnil : pointer = NIL;
  3. begin
  4.   if FullScreen then
  5.   begin
  6.         // ChangeDisplaySettings(devmode(nil^),0); //Switch Back To The Desktop
  7.         ChangeDisplaySettings(devmode(pnil^),0); // <-
  8.       showcursor(true);
  9.     end;
  10. [..]
  11.  

Das sind alle Änderungen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 09:30 
Offline
DGL Member

Registriert: Mo Aug 02, 2004 18:01
Beiträge: 12
8)
http://www.delphigl.com/forum/viewtopic.php?t=3385


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Methoden zum Umstellen der Desktopauflösung haben überhaupt nichts mit OpenGL zu tun. Das sind reine aufrufe aus der WindowsAPI. Also denke ich mal nicht, dass es mit deinen OpenGL Units zu tun hat. Leider kenne ich mich mit FreePascal auch überhaupt nicht aus. Evtl. kann dir ja jemand anders helfen. Wenn nicht schreib mal eine PM an Bero. Er hat unseren OpenGL Header FreePascal tauglich gemacht. Vielleicht kann er dir ja auch helfen.

Zum Thema Header. Da kannst du auch unseren OpenGL Header benutzen. Einfach die Unit austauchen und in der Methode ReSizeGLScene abprüfen ob eine Booleanvariable true ist. Die musst du noch anlegen (irgendwo bei h_Rc) und in die Methode CreateGlWindow wie folgt erweitern.
Code:
  1.   ...
  2.   SetFOcus(h_Wnd);
  3.  
  4.   ReadExtensions;
  5.   ReadImplementationProperties;
  6.   DeinVariablenname := True;
  7.  
  8.   ReSizeGLScene(width,height);

Damit verhinderst du, dass beim Vollbildmodus auf noch nicht initialisierte Pointer zugegriffen wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 13:39 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Mir ist das Problemm ebenfalls bekannt. Meine Lösung :
Code:
  1.  
  2. {--------------------------------------------------------------------}
  3. {  Main message loop for the application                             }
  4. {--------------------------------------------------------------------}
  5. function WinMain(hInstance : HINST; hPrevInstance : HINST;
  6.                  lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
  7. var
  8.   msg : TMsg;
  9.   finished : Boolean;
  10.   currentTime, frameTime,{ g_FrameInterval, }Freq : Int64;
  11.   speed : Single;
  12. begin
  13.   // Load OpenGL library
  14.   InitOpenGL();
  15.   ReadExtensions();                                // DIE LÖSUNG
  16.   ReadImplementationProperties();          // DIE LÖSUNG
  17.   // Load OpenGL library
  18.  
  19.   finished := False;
  20.  
  21.   // Perform application initialization:
  22.   if not glCreateWnd(1024, 768, True, 32) then // TRUE for Fullscreen
  23.   begin
  24.     Result := 0;
  25.     Exit;
  26.   end;
  27.  


Und somit braucht man keine Flagvariablle. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 14:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Möglichkeit halte ich für nicht sinnvoll wenn nicht sogar gefährlich! Wenn du es so machen würdest musstest du das nach dem Initialisieren noch einmal machen.

Da OpenGL nicht initialisiert ist kann es somit auch noch nicht sagen welche Extensions vorhanden sind. Je nach RenderContext kann die funktionalität vollkommen unterschiedlich sein. Evtl läuft das auf dem ein oder anderen RC auch nur im Softwaremodus ab. Das kann auch bei Modernen Grafikkarten der Fall sein. Für die Standardmethoden wie glColor etc würde es wahrscheinlich gehen, da diese direkt aus der OpenGL32.dll ladbar sind. Allerdings würdest du in dem Fall OpenGL Methode aufrufen die noch keinen RenderContext haben. Evtl kann das mal zu Problemen führen. Und die unterstützten Extensions bzw deren Funktionspointer können von RC zu RC komplett unterschiedlich sein. Aber an der Stelle noch einmal komplett alle Methoden abzufragen ist auch nicht unbedingt die schnellste Lösung. Da finde ich einen Booleanwert doch wesentlich effektiver.

Wenn man zum Beispiel bei einem OnPaint eines Fensters renderst sollte man das auch so machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 14:13 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Wenn man alte OpenGL.pas benutzt, hat man auch kein Problem ? Die OpenGL -Funktions werden statisch geladen unabhängig von RC oder DC. Also , indirekt sagst du, dass die sache mit OpenGL.pas ein Fehlschuss von Borland Jungs war ?
Ich meine , ich bin jetzt verwirt, da es wirklich sinn hat was du da sagst, mit dem func. Pointers und co. ? Also, ich werde auf jedem fall den Code ändern.... 8)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 11, 2005 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die OpenGL.pas die bei Delphi dabei ist, ist teilweise sogar fehlerhaft und manche Funktionen wurden umbenannt. So fehlt z.B. bei glTranslatef das f und dafür wurde die Funktion überladen usw... Außerdem enthält sie keine neueren Funktionen. In der dlgopengl.pas gibt's dafür noch praktische Funktionen wie CreateRenderingContext und ActivateRenderingContext die sich automatisch um das Erstellen des Context und auch um das richtige Laden der Extensions kümmern.


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


Wer ist online?

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