Ich hab schonmal im Forum gesucht, aber (für mich) nur ziemlich unsverständliches Zeug gefunden. Daher nochmal die Frage, die wahrscheinlich 1000 Leute vor mir schon gestellt haben:
Wie kann ich in meinem OpenGL-Projekt Antialiasing anwenden; welche Kenntnisse brauche ich, ist es überhaupt zu empfehlen / machbar für einen Anfänger?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Unsinnig ist AntiAliasing sicherlich nicht. Speziell, wenn du eine 3D Anwendung hast. Dann wirkt das ganze Bild mit AntiAlising wesentlich ruhiger. Und dazu musst du eigentlich nichts weiter machen als es zu aktivieren. Allerdings genau da beginnt das Seltsame bei OpenGL. Um AntiAliasing benutzen zu können benötigt man eine Extension und die sind erst dann verfügbar, wenn man bereits OpenGL initialisiert hat. Dazu musst du dann also erst einmal einen temporären Kontext erstellen um das passende PixelFormat ermitteln zu können.
Du solltest dir auch mal folgendes Thema anschauen. Dort existiert eine Methode die das schon ermittelt. Der Wert für das AntiAliasing ist der nach WGL_SAMPLES_ARB.
Aber beachte, dass AntiAliasing ein gewisses maß an Performance kostet und einen höheren Speicherverbrauch mit sich bringt.
In dem zusammenhang solltest du dir auch mal Inisotropische Filterung anschauen. Dadurch werden die Texturen klarer dargestellt. Also so etwas wie Fußboden. Um das zu aktivieren genügt es den Texturparameter GL_TEXTURE_MAX_ANISOTROPY_EXT zu setzen. das ist ein Integerwert zwischen 1 und dem Wert den man mittel GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT erfragen kann. Dazu aber mal in die Extension schauen.
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;
finally
Form.Free;
end;
end;
Nimm besser die. Sonst könnte nen Handle/Speicherleck entstehen, wenn cih das richtig gesehen habe.
Gruß Lord Horazont
_________________ 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
Vielen Dank schonma für die schnellen Antworten! Was das mit der Filterung angeht werde ich mal die divereses Suche bemühen - danke für den Tipp!
Was das AntiAliasing angeht, ja auf die Funktion bin ich auch schon gestoßen, aber ich weiß nach wie vor nicht was genau ich nun anstellen muss. (Habt Nachsicht mit einem kleinen Anfänger^^)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Benutzt du VCL (Delphi ganz normal) oder SDL?
Gruß Lord Horazont
_________________ 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: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Kann da vielleicht mal wer anders helfen, mein DelphiVCL für OpenGL ist ein wenig eingerostet, nachdem ich nurnoch mit SDL arbeite.
Gruß Lord Horazont
_________________ 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: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Nicht gesehen. Keine Zeit.
Bei der Erstellung eines Kontextes geschieht folgendes. Es wird ein DC erstellt. Mit Hilfe dieses DCs wird ein PixelFormat ausgewählt, welches auf diesen zugewiesen wird. Anschließend wird mit diesem DC ein Kontext erstellt. Das alles geschiet in CreateRenderingContext. Diese Methode kannst du dann allerdings nicht mehr benutzen. Aber die meiste Arbeit in der Methode ist auch die Findung des PixelFormates. Aber das macht ja bereits die Methode GetMultisamplePixelFormat für dich.
Du musst nichts weiter machen als auf deinen DC das ermittelte Pixelformat zuweisen. Das geht mit SetPixelFormat. Ich glaube der letzte Parameter darf auch nil sein. Bin mir aber nicht sicher. Falls nicht kannst du solch einen Desciptor auch mit DescribePixelFormat erfragen und dann diesen übergeben. Müsstest du dann vorher machen. Logisch.
Anschließend erstellst du mit wglCreateContext einen Kontext und aktivierst ihn. Am Besten mit ActivateRenderingContext aus der dglOpenGL.pas, da dadurch gleich die Extensions geladen werden.
Falls du nicht weißt wie du was aufzurufen hast schau am Besten einfach in die Methode CreateRenderingContext aus der dglOpenGL.pas. Ich denke das sollte so eigentlich gehen. Ist schon ein bisschen her, dass ich das das letzte Mal gemacht hatte. Von daher. Bei Problemen einfach noch mal nachharken.
Also irgendwie komme ich mir grade ziemlich blöd vor - ich glaub ich steh' auf der Leitung
Soweit bin ich jetzt mitgekommen: Um Antialiasing zu verwenden benötige ich eine Extension. Diese ist aber erst verfügbar, wenn OGL schon initialisiert wurde.
OpenGl initialisiere ich ja bisher so:
Code:
ifnot InitOpenGL then
begin
ShowMessage('Konnte OpenGL nicht initialisieren!');
Warum kann ich jetzt nicht prüfen ob die Extension verfügbar ist - oder brauche ich eben dafür jenes Pixelformat?!
Ich steh' atm etwas hilflos und verwirrt da - dein Erklärungsansatz setzt glaube ich zu spät an oder mit fehlen noch wichtige Grundlagen; Kannst du versuchen mir Schritt für Schritt von Beginn an zu erklären was (und am besten auch warum^^) ich jetzt (anders) machen muss. Ich hoffe dann fällt bei mir der Groschen^^
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Okay. Dann versuch ich das mal zu erklären. Folgendes muss gemacht werden um einen Kontext zu erstellen.
- DLL Initialisieren (InitOpenGL)
- DC erstellen (GetDC(Handle))
- RC erstellen (CreateRenderingContext)
- RC auf einem DC aktivieren (ActivateRenderingContext bzw wglMakeCurrent)
Das erstellen eines RCs lässt sich aber noch mal unterteilen, da die CreateRenderingContext nur aus unserem Header stammt. Die solltest du dir in jedem Fall auch zur Hand nehmen.
- Die gewünschten Parameter (Farbtiefe, Tiefenbuffer etc) in den PixelFormatDescriptor schreiben
- Auf dem DC ein passendes PixelFormat suchen (ChoosePixelFormat)
- Pixelformat auf den DC zuweisen (SetPixelFormat)
- Kontext erstellen (wglCreateContext)
So weit läuft das bisher ab. Der DC klebt an dem Fenster und dieser gehört zu einem Device. Also einer Hardware (in dem Fall die Grafikkarte). Das Pixelformat beschreibt ein Format. Also ob DoubleBuffering aktiv ist. Welche Farbtiefe, Tiefenbuffer etc etc etc. Das Pixelformat enthält aber KEIN Antialising. Und es kann pro DC nur ein mal setzen.
Um jetzt aber ein Pixelformat finden zu können muss man eine OpenGL Extension benutzen. Und die sind nur Verfügbar wenn bereits ein RC erstellt wurde. Also benötigen wir ein temporäres Fenster und einen Kontext mit dem wir dieses Format suchen können. Das passiert aber alles schon in der Methode GetMultisamplePixelFormat.
Du musst jetzt "nur" noch hergehen und dieses Pixelformat bei dir benutzen. Also wären das folgende Schritte.
- GetMultisamplePixelFormat
- SetPixelFormat
- wglCreateContext
Und anschließend natürlich noch mit ActivateRenderingContext aktivieren.
Wie ich aber schon mal geschrieben habe. Es könnte sein, dass du bei SetPixelFormat auch einen gefüllten PixelFormatDescriptor angeben musst. Dann aber mal mit DescribePixelFormat einen befüllen.
Und zum Code. Schau dir an was in CreateRenderingContext in der dglOpenGL gemacht wird. Dort gibt es schon alles und das funktioniert auch.
Soweit bin ich jetzt, allerdings erzeugt der Code folgende Fehlermeldung:
Zitat:
--------------------------- Debugger Exception Notification --------------------------- Project Schach.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue. --------------------------- OK Help ---------------------------
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
So in etwa dachte ich mir das. Die Zugriffsverletzung an Adresse 00000 bedeutet meistens, dass eine OpenGL Methode noch nicht geladen wurde. Und ich vermute das ist die wglChoosePixelFormatARB aus dem Code von Lord Horazont. Ruf davor mal ein Read_WGL_ARB_pixel_format oder ReadExtensions auf. Wobei das erst eigentlich ausreicht, da die Methoden später eh noch mal alle geladen werden.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ähh ja *hust*. Wundert mich jetzt auch, weshalb das so lief
Wo genau muss denn der Befehl hin? Damit ich das bei gelegenheit korrigieren kann
Gruß Lord Horazont
_________________ 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
Mitglieder in diesem Forum: Google [Bot], Majestic-12 [Bot] 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.