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

Aktuelle Zeit: Mi Jul 16, 2025 21:37

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Re: Antialias
BeitragVerfasst: Do Mai 31, 2012 11:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
leider kann ich zu deiner spezifischen frage nichts sagen, aber vill hilft dir dieses ati-aliasing verfahren, dass sogar ich implementieren konnte ;)

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Antialias
BeitragVerfasst: Do Mai 31, 2012 11:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

das Pixelformat setzt man für die Zeichenfläche, also in deinem Fall für das Fenster (nehm ich an). Mit dem COntext hat das erstmal nix zu tun. Das Pixelformat kann man nur einmal festlegen. Wenn du es danach noch einmal ändern willst, dann musst du ein neues Fenster anlegen und auch den Context neu auf dieses Fenster initialisieren.
Normalerweiße macht man das Ganze aber anders rum. Man erstellt sich zum auslesen des AntiAliasing ein extra Fenster + Context, holt sich die Werte, wertet die aus und setzt dementsprechend das Pixelformat. Ich hatte damit auch schonmal paar Probleme. Damals ist folgende Funktion entstanden. Sie ist nicht perfekt, aber sie macht das was sie soll:
Code:
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //ermittelt alle Pixelformate, die MultiSampling unterstützen
  3. //@aFormatSettings: Settings des Pixelformats;
  4. //@PFList: Liste in die die Pixelformate geschieben werden;
  5. //@SampleList: Liste in die die SampleRate passend zum Pixelformat geschrieben wird;
  6. //@MaxCount: Maximale Länge der übergebenen Listen;
  7. //@Count: Anzahl der gefundenen Pixelformate in der Liste;
  8. //@result: TRUE wenn erfolgreich, sonst FALSE;
  9. function  gluGetAntiAliasingPixelFormats(const aFormatSettings: TgluPixelFormatSettings; PFList, SampleList: PglInt; const MaxCount: Integer; var Count: Integer): Boolean;
  10. var
  11.   //temporäres Fenster zum erzeugen des RC
  12.   Form: TForm;
  13.   //ARB_Erweiterung vorhanden
  14.   //|          EXT_Erweiterung vorhanden
  15.   MultiARBSup, MultiEXTSup: Boolean;
  16.   //Liste der Integer Attribute
  17.   IAttrib: array[0..22] of Integer;
  18.   //Liste der Float Attribute (nur 0, da kein Wert)
  19.   FAttrib: GLFloat;
  20.   //temp. PixelFormat
  21.   //| Schleifenvariable
  22.   //| |  AttributName
  23.   PF, i, QueryAtrib: Integer;
  24.   //Zeiger auf zum hochzählen ni der Liste
  25.   PPosiblePF, PSample: PglInt;
  26.   //temp. RenderKontext
  27.   //| RenderContext, der zurvor aktiviert war
  28.   RC, OldRC: TgluRenderContext;
  29. begin
  30.   result       := false;
  31.   OldRC.DC     := wglGetCurrentDC;
  32.   OldRC.RC     := wglGetCurrentContext;
  33.  
  34.   Form := TForm.Create(nil);
  35.   PF := gluGetPixelFormat(Form.Handle, aFormatSettings);
  36.   RC := gluCreateRenderContext(Form.Handle, PF);
  37.   if RC.RC = 0 then begin
  38.     Form.Free;
  39.     if (OldRC.DC <> 0) and (OldRC.RC <> 0) then
  40.       gluActivateRenderContext(OldRC);
  41.     gluLastError := GLU_ERROR_INVALID_RC;
  42.     exit;
  43.   end;
  44.   if not gluActivateRenderContext(RC) then begin
  45.     Form.Free;
  46.     gluDestroyRenderContext(RC);
  47.     if (OldRC.DC <> 0) and (OldRC.RC <> 0) then
  48.       gluActivateRenderContext(OldRC);
  49.     gluLastError := GLU_ERROR_ACTIVATE_RC;
  50.     exit;
  51.   end;
  52.  
  53.   //Pixelformate mit AA auslesen
  54.   MultiARBSup := false;
  55.   MultiEXTSup := false;
  56.   if WGL_ARB_extensions_string and
  57.      WGL_ARB_pixel_format and
  58.      (WGL_ARB_MULTISAMPLE or GL_ARB_MULTISAMPLE) then
  59.     multiARBSup := true;
  60.   if WGL_EXT_extensions_string and
  61.      WGL_EXT_pixel_format and
  62.      (WGL_EXT_MULTISAMPLE or GL_EXT_MULTISAMPLE) then
  63.     multiEXTSup := true;
  64.  
  65.   if multiARBSup then
  66.     Read_WGL_ARB_pixel_format
  67.   else if multiEXTSup then
  68.     Read_WGL_EXT_pixel_format;
  69.  
  70.   if not (MultiARBSup or MultiEXTSup) then begin
  71.     Form.Free;
  72.     gluDestroyRenderContext(RC);
  73.     if (OldRC.DC <> 0) and (OldRC.RC <> 0) then
  74.       gluActivateRenderContext(OldRC);
  75.     gluLastError := GLU_ERROR_AA_NOT_SUPPORTED;
  76.   end;
  77.  
  78.   IAttrib[00] := WGL_DRAW_TO_WINDOW_ARB;
  79.   IAttrib[01] := 1;
  80.  
  81.   IAttrib[02] := WGL_SUPPORT_OPENGL_ARB;
  82.   IAttrib[03] := 1;
  83.  
  84.   IAttrib[04] := WGL_DOUBLE_BUFFER_ARB;
  85.   if (opDoubleBuffered in aFormatSettings.Options) then
  86.     IAttrib[05] := 1
  87.   else
  88.     IAttrib[05] := 0;
  89.  
  90.   IAttrib[06] := WGL_PIXEL_TYPE_ARB;
  91.   IAttrib[07] := WGL_TYPE_RGBA_ARB;
  92.  
  93.   IAttrib[08] := WGL_COLOR_BITS_ARB;
  94.   IAttrib[09] := aFormatSettings.ColorBits;
  95.  
  96.   IAttrib[10] := WGL_ALPHA_BITS_ARB;
  97.   IAttrib[11] := aFormatSettings.AlphaBits;
  98.  
  99.   IAttrib[12] := WGL_DEPTH_BITS_ARB;
  100.   IAttrib[13] := aFormatSettings.DepthBits;
  101.  
  102.   IAttrib[14] := WGL_STENCIL_BITS_ARB;
  103.   IAttrib[15] := aFormatSettings.StencilBits;
  104.  
  105.   IAttrib[16] := WGL_ACCUM_BITS_ARB;
  106.   IAttrib[17] := aFormatSettings.AccumBits;
  107.  
  108.   IAttrib[18] := WGL_AUX_BUFFERS_ARB;
  109.   IAttrib[19] := aFormatSettings.AuxBuffers;
  110.  
  111.   IAttrib[20] := WGL_SAMPLE_BUFFERS_ARB;
  112.   IAttrib[21] := 1;
  113.  
  114.   IAttrib[22] := 0;
  115.   FAttrib     := 0;
  116.  
  117.   if multiARBSup then
  118.     wglChoosePixelFormatARB(RC.DC, @IAttrib, @FAttrib, MaxCount, PFList, @Count)
  119.   else if multiEXTSup then
  120.     wglChoosePixelFormatEXT(RC.DC, @IAttrib, @FAttrib, MaxCount, PFList, @Count);
  121.  
  122.   if Count > MaxCount then
  123.     Count := MaxCount;
  124.  
  125.   QueryAtrib := WGL_SAMPLES_ARB;
  126.   PSample    := SampleList;
  127.   PPosiblePF := PFList;
  128.   for i := 0 to Count-1 do begin
  129.     if multiARBSup then
  130.       wglGetPixelFormatAttribivARB(RC.DC, PPosiblePF^, 0, 1, @QueryAtrib, PSample)
  131.     else if multiEXTSup then
  132.       wglGetPixelFormatAttribivEXT(RC.DC, PPosiblePF^, 0, 1, @QueryAtrib, PSample);
  133.     inc(PSample);
  134.     inc(PPosiblePF);
  135.   end;
  136.  
  137.   if not gluDestroyRenderContext(RC) then begin
  138.     Form.Free;
  139.     exit;
  140.   end;
  141.   Form.Free;
  142.  
  143.   if (OldRC.DC <> 0) and (OldRC.RC <> 0) then
  144.     if not gluActivateRenderContext(OldRC) then
  145.       exit;
  146.  
  147.   result := True;
  148. end;  


MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Antialias
BeitragVerfasst: Do Mai 31, 2012 12:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Welche Unit meinst du? Die für TForm? Du musst keine TForm nehmen, wenn du willst kannst du dir auch ein Fenster direkt von Windows erstellen lassen. Dann musst du nur die entsprechenden Funktionen dafür laden. Nur mit dglOpenGL geht das nicht, weil die keine Routinen zur Verfügung stellt, um ein Fenster zu erzeugen.
Meine CreateRenderContext bekommt von mir das Handle der Zeichenfläche und ein Pixelformat. Den Rest macht die Funktion selbst. Dort ist auch das entsprechende ErrorHandling eingebaut. So Unsinnig find ich das nicht.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Antialias
BeitragVerfasst: Do Mai 31, 2012 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Die dglOpenGL brauchst du immer. Meine Funktion ist da nur zwischengelagert, um die Initialisierung bisl zu vereinfachen. Im Grund macht die nix anderes als die Funktionen aus der dglOpenGL aufzurufen. Irgendwann kommt immer der Aufruf von wglCreateContext. Das ist die eigentliche Funktion die einen Context erstellt, und die kommt aus der dglOpenGL, oder besser gesagt aus der GLU32.dll
Wenn du die Anwendung so klein wie möglich halten willst, dann würde ich eh nicht den dgl-Header verwenden, sondern die Funktionen die du benötigst selbst aus der DLL laden. Dann hast du nur genau das im Code, was du auch wirklich brauchst.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Antialias
BeitragVerfasst: Do Mai 31, 2012 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ja da sind noch viele Funktionen und Typen von mir mit drin. Ich hab dir die Sachen die du dafür brauchst mal zusammen gepackt. Ich hoffe ich hab nix vergessen...
der Aufruf der Funktionen sieht dann ungefähr so aus:
Code:
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. function TglContext.GetPF: Integer;
  3. var
  4.   PFList, SampleList: array[0..31] of glInt;
  5.   c, i: Integer;
  6. begin
  7.   result := 0;
  8.   c := 0;
  9.   if fAASampleRate > 0 then begin
  10.     if not gluGetAntiAliasingPixelFormats(fPFSettings, PFList, SampleList, Length(PFList), c) then
  11.       raise EglContext.Create('can''t read anti aliasing pixel formats. error code: 0x'+IntToHex(gluGetLastError(), 8))
  12.     else begin
  13.       for i := 0 to c-1 do begin
  14.         if SampleList[i] = fAASampleRate then begin
  15.           result := PFList[i];
  16.           exit;
  17.         end;
  18.       end;
  19.     end;
  20.   end else if Assigned(fCanvas) then begin
  21.     result := gluGetPixelFormat(fRenderContext.Handle, fPFSettings);
  22.   end;
  23. end;  
  24.  
  25. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. procedure TglContext.CreateContext;
  27. var
  28.   PF: Integer;
  29. begin
  30.   if not Assigned(fCanvas) then
  31.     raise EglContext.Create('no valid canvas assigned');
  32.  
  33.   PF := GetPF;
  34.   if PF = 0 then
  35.     raise EglContext.Create('can''t find matching pixel format');
  36.  
  37.   gluGetLastError;
  38.   fRenderContext := gluCreateRenderContext(fCanvas.GetHandle, PF);
  39.   case gluGetLastError of
  40.     GLU_ERROR_INIT_OPENGL:
  41.       raise EglContext.Create('can''t initialize OpenGL');
  42.     GLU_ERROR_INVALID_PIXELFORMAT:
  43.       raise EglContext.Create('invalid pixel format');
  44.     GLU_ERROR_CREATE_DC:
  45.       raise EglContext.Create('invalid devide handle');
  46.     GLU_ERROR_SET_PIXELFORMAT:
  47.       raise EglContext.Create('can''t activate pixelformat for canvas');
  48.     GLU_ERROR_CREATE_RC: begin
  49.       fPixelFormatActivated := true;
  50.       raise EglContext.Create('can''t create render context');
  51.     end;
  52.   end;
  53.   fPixelFormatActivated := true;
  54.   UpdateVieport;
  55. end;  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.008s | 14 Queries | GZIP : On ]