Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ist wie gesagt wirklich nicht böse gemeint. Waren nur ein paar Ideen um es kompatibler zu gestalten und evtl Schwachstellen aufzudecken. Diverse Eigenarten und vorgehensweisen mit den Extensions lernt man ja auch nur wenn man es gesagt bekommt oder irgendwo auf die Nase fällt.
Die Verfügbarkeit der Extension ist bei jedem System immer anders. Für jede Extension haben wir im Header eine Booleanvariable eingefügt mit der du abfragen kannst ob die Extension verfügbar ist oder nicht. In diesem Falle WGL_ARB_pixel_format. Diese Variablen werden durch ActivateRenderContext oder ReadImplementationProperties mit leben gefüllt. Die Funktionspointer werden entweder auch durch ActivateRenderContext (Dritte Parameter True) oder durch Read_Extensionname geladen.
Bei einige Extension gibt es Alternativen bei einigen Anderen wiederrum nicht. Multisampling ist da eher ein nettes Gimick welches aber nicht zwingend notwendig ist. Wobei ich das bei mir in einem Rutsch gemacht habe. Also zu erst Normal den Kontext initialisieren und dann abgeprüft ob Multisampling vorhanden ist. Pixelformat ausgewählt und wenn alles Okay war, dann habe ich Kontext, DC und Fenster gelöscht und neu angelegt. Wenns nicht in Ordnung ist wird einfach nur bestimmter Code nicht ausgeführt. Dabei läuft das Programm liniear ab was nicht ganz so verwirrend ist. Denke ich.
Bin auf jeden Fall noch gespannte was du noch so alles raus findest.
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
So, nun hab ich's. Einen schönen Code mit Fallback und vielen Kommentaren, damit jeder versteht, was warum gemacht wird.
Wenn ihr Fehler im Code findet oder Verbesserungsvorschläge habt, dann schreibt es doch einfach in dieses Forum oder schickt mir eine PN, oder was auch immer...
Um das ganze recht simpel zu machen, habe ich einfach alles in FormCreate gepackt. Schöner und übersichtlicher ist's selbstverständlich wenn man die ganze OpenGL-Initialisierung in eine eigene Prozedur steckt.
Ich habe den Code selbst auf mehreren Multisample-unterstütztenden und auch auf mehreren nicht-Multisample-unterstützenden Grafikkarten getestet und es hat bis jetzt immer einwandfrei geklappt. Keine Fehlermeldungen, wenn Multisample unterstützt wird, wird's implementiert und sonst wird halt das Fallback-Pixelformat verwendet.
Ich habe aber auch noch eine kleine Frage: Wenn eine Grafikkarte weder WGL_ARB_MULTISAMPLE noch WGL_EXT_MULTISAMPLE unterstützt, gibt es dann (ausser mit Accumulation-Buffer) noch ne andere Variante um hübsches Anti-Aliasing hinzukriegen? Und wie würde die Accumulation-Methode genau funktionieren?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Sorry. Hat nen bisschen gedauert. Also ich finden den Code wirklich gut. Sehr gute arbeit. Habe aber noch ein paar Anmerkungen.
Du suchst die Liste mit den PixelFormaten und suchst nach dem mit der höchsten Sampleanzahl. Das finde ich nicht ganz so glücklich. Mitunter benutze ich bei einigen Spielen bewusst nur 2 oder 4faches Antialising. Da es eben ein bisschen Leistungshungrig ist und man so mitunter leistung einsparen kann. Besonders bei modernen Spielen ist mein Rechner mitunter ein bisschen überfordert. Ich denke es wäre da besser wenn man sagt 2fach und er macht es oder lässt es. Zu herrausfinden was überhaupt unterstützt wird ist das aber sicherlich schon eine sehr sinnvolle Möglichkeit.
Eine andere Sache wäre, dass man auch noch evtl Texturen laden muss oder diverse Einstellungen tätigen muss. Wenn du zwischendrin in der Methode ein Exit aufrufst dann gelangt man nicht in die Initialisierung die sich unter der Kontexterstellung befindet. Der alte Kontext existiert zu diesem Zeitpunkt ja noch. Das bedeutet, dass OpenGL ja auf jeden Fall funktioniert.
Evtl wäre es praktisch, wenn du vor dem DestroyWnd noch den Kontext und den DC zerstörst / Freigibst. Ist zwar normal nicht zwingend notwendig aber besser wäre es bestimmt, wenn man alles freigibt was man sich geholt hat. Ich traue Windows da nur so weit wie ich einen Konzertflügel werfen kann.
PS: Ich hoffe du verstehst meine Anmerkungen nicht als Kritik. Ich neige manchmal unter Umständen ein bisschen zu Perfektionissmus ... und Untertreibungen.
Accumulation: Im RedBook stand dazu glaube ich etwas. Aber das würde ich persönlich nicht machen. Das ist wohl nur gefaked da das echte Antializing da sogar nur Pixelzwischenschritte nimmt und nicht wie der Buffer als kleinsten Schritt ein Pixel kennt. Muss aber gestehen, dass ich das vor ner halben Ewigkeit mal gelesen habe und mittlerweile es nicht mehr genau weiß. Um ehrlich zu sein ist die Erinnerung daran ziemlich verblasst. Ich denke mal, dass man da Heutzutage eher mit FramebufferObject oder Ala RenderToTexture mehr erreichen kann. Aber auch das wird wahnsinnig Langsam. Und auf Karten die kein Multisampling unterstützen dürfte das der absolute Overkill sein.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Holzauge sei Wachsam. Ist mir doch zum Accumulationbuffer noch was eingefallen. Humus hatte bei sich auf der Seite vor einer Weile eine Supersampling Demo. Dabei löst er das mit dem Accumbuffer und durch leichtes verändern der Projection. Dabei wird aber eine Szene bis zu 11 Mal gezeichnet. Was natürlich schon recht häftig ist. Ist natürlich die Frage wie schnell es wäre, wenn man in ein FramebufferObject rendern und dieses dann nur 11 Mal an leicht unterschiedlichen Stellen rendert. Das sollte eigentlich schneller gehen als die komplette Szene 11 Mal zu rendern. Was sich speziell bei sehr großen Szenen bemerkbar machen dürfte. Aber ob es dadurch Praxistauglicher wird wage ich zu bezweifeln.
PS: Seine neuste Demo ist zwar DX und benötigt Shader Model 3. Aber dabei hat er einen Selectives Supersampling eingebaut.
Registriert: Mi Feb 22, 2006 10:41 Beiträge: 12 Wohnort: St. Gallen - Schweiz
Erst mal Danke für die Infos über den Accumulationbuffer.
Anzahl der Samples Wenn mein Projekt dann mal fertig ist, stelle ich mir das folgendermassen vor: Wenn das Programm zum ersten Mal ausgeführt wird, werden alle unterstützten Sample-Anzahlen ausgelesen und in ein Konfigurations-File (ini oder xml) geschrieben. Der Benutzen kann dann auswählen, wie viele Samples er haben möchte, natürlich stehen ihm nur die unterstützten Samples zur Verfügung.
Ich wollte hier eigentlich nur die Methode zum Auslesen der unterstützten Samples zeigen, wie man es dann schlussendlich macht, ist jedem selbst überlassen.
exit Ich bin mir des exit-Problems in diesem Code-Beispiel voll bewusst, aber ich entschied mich, es trotzdem so zu lassen, weil ich einen möglichst simplen Code posten wollte, der nur das Grundgerüst darstellt. In meinem Programm ist das, was hier bei FormCreate ausgefürht wird, in einer Unterprozedur (InitializeWindow) der Prozedur InitializeOpenGL. InitializeOpenGL führt zuerst InitializeWindow aus und dann folgen weitere Prezeduren, wie Einstellungen initialisieren, Projektionsmatrix initialisieren, Lichter, Materialen, Texturen initialisieren bzw. laden etc.
Wenn also das exit nur in einer Unterprozedur ist, nach der alle anderen Dinge initialisiert werden, stellt es kein Problem mehr dar.
Und noch zum Schluss: Ich verstehe Deine Anmerkungen durchaus als Kritik , aber selbstverständlich als konstruktive Kritik und die ist fast immer angebracht... genauso wie Perfektionismus...
Die Idee mit dem zerstören und anschließendem Wiedererstellen des Fensters ist gut. Man könnte sie aber umgehen. Bei vielen Spielen sieht man ein Launch-Programm, in dem man z.B. die Auflösung einstellt, den Treiber auswählt etc. Eine Möglichkeit wäre es also, über ein solches Programm die ID des Pixelformates auszulesen bzw. gleich alle wichtigen Einstellungen zu treffen. Dabei wird das Fenster des Launchers zum Ermitteln der PixelFormate genutzt und das eigentliche Darstellungsprogramm übernimmt es. Da beim Start immer erst der Launcher erscheint, könnte man so auch auf geänderte Grafikkarten / PixelFormat IDs zugreifen.
_________________ "Wer nicht arbeitet, kann auch nichts falsch machen"
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Sorry, wenn ich den Thread jetzt aus seiner leichten Versekung hole, aber ich habe den Pixel-Format-Sucher mal in eine Funktion geschrieben, sodass man nicht selber das Fenster zerstören und wieder neu erstellen muss.
Diese Funktion erstellt ein tempräres Fenster, sucht nach einem Multisample PF und gibt dieses dann zurück. Für den Fall, dass kein Multisample unterstützt wird, wird ein einfaches PF zurückgegeben.
MessageDlg('Rendering Context konnte nicht abgewählt werden.', mtError,[mbOk],0);
if(not wglDeleteContext(RC))then
MessageDlg('Rendering Context konnte nicht freigegeben werden.', mtError,[mbOk],0)
end;
end;
Ich hoffe, das ist hilfreich.
Gruß Lord Horazont
[WIKITASTISCH]
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Also, ich denk mal nicht, dass der im Wiki steht. Der Artikel, den ich damals geschrieben habe, hab ich vor ziemlich genau einem Jahr erzeugt (ich habe grade nachgesehen), und zwar aufgrund dieses Threads hier. Ganz unten habe ich bloss einen Hinweis dazugeschrieben, wie das Ganze prinzipiell geht.
Ich habe dafür getesteten Sourcode, den ich auch gerne fürs Wiki zur Verfügung stelle. Allerdings arbeite ich schon lange nicht mehr mit der VCL, es handelt sich um die Windows API. Umschreiben möchte ich das derzeit aber nicht: ich arbeite mich grade in ein anderes Gebiet ein.
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.