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...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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
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.
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!
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:
// Uses Windows, Messages, OpenGL, GLaux;
Uses Windows, Messages, GL, Glu;// <-
Code:
procedure KillGLWindow;
CONST pnil :pointer=NIL;
begin
if FullScreen then
begin
// ChangeDisplaySettings(devmode(nil^),0); //Switch Back To The Desktop
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:
...
SetFOcus(h_Wnd);
ReadExtensions;
ReadImplementationProperties;
DeinVariablenname :=True;
ReSizeGLScene(width,height);
Damit verhinderst du, dass beim Vollbildmodus auf noch nicht initialisierte Pointer zugegriffen wird.
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.
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....
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.
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.