Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Hallo Leute
Bis jetzt habe ich den OpenGL-Header "OpenGL12.pas" benützt und bin nun auf "dglOpenGL.pas" umgestiegen, weil es einen sehr guten Eindruck auf mich macht. Ich möchte nun Multisampling einbauen, aber leider scheitere ich schon bei der Erstellung des PixelFormats... wglChoosePixelFormatARB produziert nämlich die ganze Zeit eine Access Violation at address 00000000. Meine Grafikkarte unterstützt Multisample sicher, da ich das Programm von NeHe http://nehe.gamedev.net/data/lessons/le ... ?lesson=46 problemlos compilieren und ausführen kann.
Hier mal die wesentlichen Teile des Codes, alles nach wglChoosePixelFormatARB hab ich noch nicht ganz fertig, da zuerst mal wglChoosePixelFormatARB funktionieren muss...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Erst mal Willkommen am Board.
Zitat:
Ich habe keine Ahnung, wieso diese Access Violation zustande kommt, aber ich hoffe, Ihr könnt mir da weiterhelfen...
Bestimmt.
So dann wollen wir dir mal auf die Sprünge helfen. Wenn du verstehst was das eigentliche Problem ist dann wirst du auch sicherlich sehen wie du es beheben kannst.
Die Zugriffsverletzung entsteht dadurch, da du versuchst eine Methode zu benutzen dessen Pointer noch nicht geladen wurde. Die Adresse 00000000 ist ein eindeutiges Zeichen dafür, dass der Wert Nil ist.
Warum ist der Pointer noch nil. Weil die Methode zu einer Extension gehört dessen Pointer erst geladen werden kann, wenn bereits ein Kontext erstellt wurde. Das ist so, weil die Extensions auch abhängig vom verwendeten Kontext sein können. Je nachdem kann es sein, dass die ein oder andere Extension bei gewissen Einstellungen gar nicht existiert.
Das Paradoxon an der Stelle ist nun mal die Sache, dass du eigentlich den Kontext mit der Extension WGL_ARB_pixel_format erstellen möchtest diese aber erst Verfügbar ist sofern auch ein Kontext existiert.
Du müsstest entsprechend zu Begin einen Kontext erstellen der nur dazu dient um festzustellen ob die Extension verfügbar ist. Und wenn ja, dann kannst du sie benutzen und erstellst einen weiteren Kontext der MultiSampling unterstützt. Den anderen kannst du dann wieder löschen. Entweder bevor du den anderen erstellst oder danach. Das weiß ich jetzt nicht so genau.
ChoosePixelFormat funktioniert einwandfrei, aber wglChoosePixelFormatARB liefert mir einfach kein PixelFormat...
Nochmals vielen Dank für Eure Hilfe! Ich bin echt froh, dass es so ne super Community gibt!! (ohne Delphigl.com hätte ich wahrscheinlich kein einziges OpenGL-Programm programmiert)
Gamer 2000
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Ich musste soeben eine schreckliche Entdeckung machen: Das Beispiel-Programm, welches ich im ersten Post angegeben habe, bekommt von wglChoosePixelFormatARB auch kein PixelFormat!! Leider gibt's dort keine Fehlermeldung oder so...
Ich weiss wirklich nicht, was los ist, oder was ich falsch mache...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich muss ehrlich gestehen, dass ich so etwas auch schon ein paar Mal ausprobiert habe es aber selber bisher noch nicht hinbekommen habe. Ich weiß aber, dass es geht. Die glScene Komponenten können das. Die machen das in etwa auch genau so. Na ja. Fast. Die erstellen dafür eine extra Fensterklasse und benutzen diesen zum auslesen der Methoden. Und dann erstellen sie den richtigen Kontex. Habe aber derzeit weder die Quellen noch den dafür notwendigen Kopf um mich da jetzt durchzuwühlen.
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Ich habe mal mit dem "OpenGL Extensions Viewer" http://www.realtech-vr.com/glview/index.html meine Grafikkarte ein bisschen erkundet. Dieses kleine Tool kann auch alle PixelFormate anzeigen. Ich habe mir ein passendes PixelFormat ausgesucht (eines, das Multisampling unterstützt) und habe einfach dessen ID bei SetPixelFormat eingesetzt... SetPixelFormat hat mir false zurückgegeben
Ich habe viel Zeit damit verbraucht, im Internet nach Dokumentation über Multisampling mit OpenGL zu suchen. Leider habe ich nur viele kleine Artikel gefunden, welche sagen, dass Multisampling mit OpenGL möglich ist. Konkrete Informationen oder Code-Beispiele habe ich keine gefunden...
Ich wäre wirklich froh, wenn jemand, der Erfahrung mit Multisampling hat, sein Wissen kund tun könnte...
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Gute Nachricht! Ich hab's geschafft!!
naja... zumindest teilweise...
Ich habe mal das Tutorial "Pixelbuffer" unter die Lupe genommen. Dort wird auch ein PixelFormat mittels WGL_ARB_pixel_format erstellt. Diese Teile habe ich einfach übernommen und siehe da, wglChoosePixelFormatARB liefert die gewünschten PixelFormats.
Aber leider kann ich das PixelFormat dann nicht setzten... SetPixelFormat liefert einfach immer false... ich kann mir aber nicht vorstellen, wieso... evtl. liegt's an diesem PixelFormatDescriptor...
Hier mal der Code, ich hoffe jemand findet den Fehler...
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
So, ich hab das Problem nun endgültig gelöst!
Die Lösung habe ich mehr oder weniger durch Zufall gefunden. Weil es mich wunder nahm, wann der letzte Post geschrieben wurde, stiess ich auf viewtopic.php?t=5241 gestossen und da liegt die Antwort:
Zitat:
Setting the pixel format of a window more than once can lead to significant complications for the Window Manager and for multithread applications, so it is not allowed. An application can only set the pixel format of a window one time. Once a window's pixel format is set, it cannot be changed.
Weil mein Fenster ja schon ein PixelFormat hat (das muss ich ja zuerst erstellen, um die Extensions nutzen zu können) muss ich das Fenster, nachdem das PixelFormat, welches Multisampling unterstützt gefunden ist, zerstören und es anschliessend neu konstruieren...
Für alle Interessierten hier der Code, mit dem es nun endlich funktioniert:
{weitere Dinge, wie Projektions-Matrix, Kamera etc. initisieren...}
end;
end;
Ich hoffe damit ist nicht nur mir sondern auch noch anderen, welche ebenfalls Multisampling in ihr Projekt einbauen wollen, gedient. Ich kann nur sagen, Multisampling ist echt der Hammer... kein Vergleich zu den elenden Pixel-Treppen, also wenn's die Grafikkarte unterstützt -> sofort implementieren
Was ich mich frage... Wieso erst Fenster erzeugen, dann zerstören und dann wieder erzeugen? Kann man denn nicht gleich nach nem Pixelformat suchen, was Multisampling unterstützt?
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Also erst einmal: Eintrag ins Wiki sollte bald folgen (heute hab ich keine Zeit mehr dafür, aber ziemlich sicher morgen Abend).
Zur Frage von Frase:
Wie schon Lossy eX gesagt hat, ist folgendes das Problem: Um ein PixelFormat zu finden, welches Multisampling unterstützt, muss man die WGL_ARB_pixel_format Extensions nutzen können. Diese Extension wird aber erst verfügbar, wenn man bereits ein Fenster mit Kontext erstellt hat. Dann kann man das PixelFormat für Multisampling suchen und wird es hoffentlich auch finden
Aber das Fenster hat ja schon ein PixelFormat (braucht es, damit man überhaupt nach Multisample-PixelFormat suche kann) und Windows erlaubt es nicht, einem Fenster, das schon ein PixelFormat hat, ein neues PixelFormat zuzuordnen. Also muss man das gefundene Multisample-PixelFormat speichern (ich mach das mit SuitablePF), das Fenster mit dem "Such-PixelFormat" zerstören, ein neus Fenster erzeugen und diesem neuen Fenster kann man das gespeicherte Multisample-PixelFormat zuordnen.
Das PixelFormat an sich ist nur ein Integerwert und repräsentiert die ID eines auf der Grafikkarte gespeicherten PixelFormates. Wenn man also für sein Programm immer die gleiche Grafikkarte verwendet, kann man einmal das PixelFormat mit der oben beschriebenen Methode suchen, sich den Integerwert aufschreiben oder ganz gut merken und dann das Fenster immer sofort mit diesem PixelFormat erstellen.
Ich hoffe das war verständlich genug... sonst frag einfach nochmal...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Frase: Das isn Zeitraum von weniger als 500 MilliSekunde. Wie willst du denn da nen Treiber updaten? Das auf die Festplatte zu speichern und beim nächsten Start wieder zu benutzten wäre höchst fragwürdig. Nein. Diese Aktion muss bei jedem Programmaufruf neu gemacht werden.
Gamer: Der Vollständigkeit halber solltest du evtl auch die Extension WGL_EXT_pixel_format mit unterstützen. Die ist Baugleich zu der ARB nur die Methoden sind anders. Die Konstanten sind da auch gleich.
Wo lädst du eigentlich die ARB Extension? Habe das so jetzt nicht gesehen. Und ein Fallback für den Fall, dass sie nicht unterstützt wird wäre auch gut. Bzw finde ich den Code ein wenig wirr (Nicht böse gemeint). Ich denke mal ein etwas unerfahrener User dürfte daraus nichts lernen. Sollte man noch mal ein bisschen überarbeiten bevor es ins Wiki übernommen wird. Aber sonst wirklich klasse. Werde mir das Prinzip mit sicherheit auch aneignen. Weiter so.
[edit] Bereich zu RecreateWnd entfernt, da der anscheinend im Vergleich zu DestroyWnd und CreateWnd die Sichtbarkeit des Fensters ändert. Was in einem OnShow definitiv nicht klappt. Habe ich gerade schmerzlich erfahren.
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Ehrlich gesagt, war das das erste Mal, das ich mit Extensions gearbeitet habe (darum auch die Startschwierigkeiten...) und ich habe gedacht, dass die Extensions einfach immer verfügbar sind; also dass man die nicht laden muss...
Ein Fallback gehört bestimmt dazu! Ich bin jetzt auch noch an einer Version dran, die auslesen kann, wie viele Samples die Grafikkarte unterstützt. Aber beim obigen Code ging es mir primär darum, einfach Multisampling mal aktivieren zu können, darum habe ich mich noch nicht um Fallback etc. gekümmert...
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.