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

Aktuelle Zeit: Mo Jul 07, 2025 06:41

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
 Betreff des Beitrags: Antialiasing
BeitragVerfasst: So Jan 20, 2008 11:56 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
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?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 13:13 
Offline
DGL Member
Benutzeravatar

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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zu der Funktion, zu der Lossy verlinkt hat:
Die ist mehr Quick'n'Dirty, hier nochma eine überarbeitet Version:
Code:
  1.  
  2. function GetMultisamplePixelFormat: TGLUInt;
  3. var
  4.   Form: TForm;
  5.   RC: HGLRC;
  6.   DC: HDC;
  7.   IAtrib: array[0..20] of TGLUInt;
  8.   FAtrib: TGLFloat;
  9.   PixelFormat: array[0..64] of TGLUInt;
  10.   numPixelFormats, tmpDC: TGLUInt;
  11.   pfd: TPixelFormatDescriptor;
  12.   Buf: TGLUInt;
  13. begin
  14.   Form := TForm.Create(nil);
  15.   try
  16.     DC := GetDC(Form.Handle);
  17.     RC := CreateRenderingContext(DC, [opDoubleBuffered], 24, 24, 0, 0, 0, 0);
  18.      
  19.     with pfd do
  20.     begin
  21.       nSize := SizeOf(TPixelFormatDescriptor);
  22.       nVersion := 1;
  23.       dwFlags := PFD_DRAW_TO_WINDOW
  24.       or PFD_SUPPORT_OPENGL
  25.       or PFD_DOUBLEBUFFER;
  26.       iPixelType := PFD_TYPE_RGBA;
  27.       cColorBits := 24;
  28.       cAlphaBits := 0;
  29.       cDepthBits := 24;
  30.       cStencilBits := 0;
  31.     end;
  32.     Buf := ChoosePixelFormat(DC, @pfd);
  33.     if Buf = 0 then
  34.     begin
  35.       MessageDlg('OpenGL not supported! Please install a NEW graphics driver!', mtError, [mbOK], 0);
  36.       if RC<>0 then
  37.       begin
  38.         if (not wglMakeCurrent(DC,0)) then
  39.           MessageDlg('Rendering Context konnte nicht abgewählt werden.', mtError, [mbOk], 0);
  40.         if (not wglDeleteContext(RC)) then
  41.           MessageDlg('Rendering Context konnte nicht freigegeben werden.', mtError, [mbOk], 0)
  42.       end;
  43.       Application.Terminate;
  44.       Exit;
  45.     end;
  46.     SetPixelFormat(DC, Buf, @pfd);
  47.      
  48.     IAtrib[0] := WGL_DRAW_TO_WINDOW_ARB;
  49.     IAtrib[1] := 1;
  50.     IAtrib[2] := WGL_SUPPORT_OPENGL_ARB;
  51.     IAtrib[3] := 1;
  52.     IAtrib[4] := WGL_DOUBLE_BUFFER_ARB;
  53.     IAtrib[5] := 1;
  54.     IAtrib[6] := WGL_PIXEL_TYPE_ARB;
  55.     IAtrib[7] := WGL_TYPE_RGBA_ARB;
  56.     IAtrib[8] := WGL_COLOR_BITS_ARB;
  57.     IAtrib[9] := 24;
  58.     IAtrib[10] := WGL_ALPHA_BITS_ARB;
  59.     IAtrib[11] := 8;
  60.     IAtrib[12] := WGL_DEPTH_BITS_ARB;
  61.     IAtrib[13] := 24;
  62.     IAtrib[14] := WGL_STENCIL_BITS_ARB;
  63.     IAtrib[15] := 0;
  64.     IAtrib[16] := WGL_SAMPLE_BUFFERS_ARB;
  65.     IAtrib[17] := 1;
  66.     IAtrib[18] := WGL_SAMPLES_ARB;
  67.     IAtrib[19] := 6;
  68.     IAtrib[20] := 0;
  69.      
  70.     FAtrib := 0;
  71.      
  72.     if not wglMakeCurrent(DC,RC) then
  73.     begin
  74.       MessageDlg('Couldn''t enable rendering context', mtError, [mbOK], 0);
  75.       if RC<>0 then
  76.       begin
  77.         if (not wglMakeCurrent(DC,0)) then
  78.           MessageDlg('Rendering Context konnte nicht abgewählt werden.', mtError, [mbOk], 0);
  79.         if (not wglDeleteContext(RC)) then
  80.           MessageDlg('Rendering Context konnte nicht freigegeben werden.', mtError, [mbOk], 0)
  81.       end;
  82.       Application.Terminate;
  83.       Exit;
  84.     end;
  85.      
  86.      
  87.      
  88.     wglChoosePixelFormatARB(DC,@IAtrib,@FAtrib,length(PixelFormat),
  89.     @PixelFormat,@numPixelFormats);
  90.      
  91.     if numPixelFormats = 0 then
  92.     begin
  93.       Result := Buf;
  94.     end
  95.     else
  96.       Result := PixelFormat[0];
  97.      
  98.     if RC<>0 then
  99.     begin
  100.       if (not wglMakeCurrent(DC,0)) then
  101.         MessageDlg('Rendering Context konnte nicht abgewählt werden.', mtError, [mbOk], 0);
  102.       if (not wglDeleteContext(RC)) then
  103.         MessageDlg('Rendering Context konnte nicht freigegeben werden.', mtError, [mbOk], 0)
  104.     end;
  105.   finally
  106.     Form.Free;
  107.   end;
  108. end;
  109.  


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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 14:19 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
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. :oops: (Habt Nachsicht mit einem kleinen Anfänger^^)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 14:47 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 14:58 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
Delphi ganz normal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 15:05 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 21, 2008 19:18 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
*push*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 14:53 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
Wird das Thema nur nicht mehr gesehen oder weiß es niemand?^^ Was muss ich denn nun genau tun?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 15:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nicht gesehen. Keine Zeit. :P


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 15:50 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
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:
  1. if not InitOpenGL then
  2.   begin
  3.     ShowMessage('Konnte OpenGL nicht initialisieren!');
  4.     Application.Terminate;
  5.   end;
  6.   DC := GetDC(Handle);
  7.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  8.   ActivateRenderingContext(DC, RC);

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^^

mfg :)


// Edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 17:18 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 18:03 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
So langsam wirds mir klarer...
Code:
  1. procedure TForm_Main.SetupGL;
  2. var
  3.   PixelFormat: TGLUInt;
  4.   PFDescriptor: TPixelFormatDescriptor;
  5. begin
  6.   if not InitOpenGL then
  7.   begin
  8.     ShowMessage('Konnte OpenGL nicht initialisieren!');
  9.     Application.Terminate;
  10.   end;
  11.   DC := GetDC(Handle);
  12.   //RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  13.  
  14.   PixelFormat := GetMultisamplePixelFormat;
  15.   DescribePixelFormat(DC, PixelFormat, SizeOf(PFDescriptor), PFDescriptor);
  16.   SetPixelFormat(DC, PixelFormat, @PFDescriptor);
  17.   RC := wglCreateContext(DC);
  18.  
  19.   ActivateRenderingContext(DC, RC);
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
---------------------------


// Edit Lossy: Code durch Pascaltags ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 19:46 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 23, 2008 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ähh ja *hust*. Wundert mich jetzt auch, weshalb das so lief :D

Wo genau muss denn der Befehl hin? Damit ich das bei gelegenheit korrigieren kann :D

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 networkmy 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


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 4 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.014s | 19 Queries | GZIP : On ]