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

Aktuelle Zeit: Fr Jul 18, 2025 07:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 07:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ab OpenGL3 ist ein MSAA FrameBufferObject dabei. Was den Code stark vereinfacht und es ist ein Core Feature :)
Der Nachteil, du brauchst eine OpenGL3 fähige Grafikkarte und ein entsprechenden Context.

Eine andere Alternative ist Morphological Antialiasing, welches z.B. von God of War 3 verwendet wird, damit man sehr hoch qualitatives AA zu günstigere Performance bekommt. http://visual-computing.intel-research.net/publications/mlaa.pdf

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Morphological Antialiasing: Das sieht ja ganz witzig aus. Allerdings findest du nicht, dass das vielleicht für ein Hobbyprojekt ein wenig arg abgehoben ist? Für In solchen Projekten kommt es typischerweise nicht so wahnsinnig auf Performance an. Da genügt ein simples FSAA ja doch wohl vollkommen aus.

Bergmann: Doch ich habe Verbesserungsvorschläge. Ich habe deinen Code nur leicht überfogen aber eines ist mir sofort ins Auge gefallen. Der dürfte richtig richtig langsam sein.

Du erstellst alle Nase lang ein TForm mit einem Context und rufst dann dort immer ReadImplementationProperties und ReadExtensions auf. Diese Methoden laden ALLE OpenGL Funktionspointer. Und das dauert selbst bei einem einmaligen Aufruf schon recht lange. Aber wenn ich mich nicht verzählt habe, dann rufst du das im ungünstigsten Fall 17 Mal auf. Obendrauf kommt, dass du den Kontext immer und immer wieder erstellst. Das ist nicht nötig. Die ganzen Operationen die du machst lassen sich in dem selbem Kontext durchführen. Das geht aber mit Funktionen nicht. Hier wäre eine Klasse die erste Wahl gewesen.

Du hast in dem Verfahren vor allem keinen sinnvollen Rollback falls deine Samplerate nicht unterstützt wird. Entweder 16 (was schon echt richtig hoch ist) oder gar keines. Finde ich unschön. Aber nicht so unschön wie Exceptions als Rückgabewert.

Was ich auch festgestellt habe ist, dass du Formate mit WGL_SAMPLE_BUFFERS_ARB = 1 erfragst und dann letzten Endes durch die Liste gehst und dir das Format erfragst welches 16 Samplebuffer hat. Und so wie du das machst kann es dir auch passieren, dass OpenGL dir sonst was unterjubelt. Und so generell gehalten kann es auch sein, dass die 16 Stellen in dem Array gar nicht ausreichen. Was im übrigen nicht initialisiert wurde. Und beim Durchsuchen der Liste gehst du auch durch alle Elemente selbst wenn die OpenGL Funktion nur 2-3 zurückgeliefert hat.

Ich entschuldige mich schon mal, falls das zu drastisch formuliert war/ist. Allerdings finde ich, dass der Code noch einige wirkliche Mängel aufweißt und das sollte so nicht ins Wiki als Referenz für alle.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 13:24 
Offline
DGL Member
Benutzeravatar

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

@TAK2004: Ich glaub auch, dass das normale AA erstmal reicht, ich bin schon froh das ich das so erstma hin bekommen hab^^
@Lossy eX:
Lossy eX hat geschrieben:
Ich entschuldige mich schon mal, falls das zu drastisch formuliert war/ist. Allerdings finde ich, dass der Code noch einige wirkliche Mängel aufweißt und das sollte so nicht ins Wiki als Referenz für alle.

Brauchst dich nich entschuldigen, ich war schon auf sowas gefasst. Deshalb hab ich die Frage ja gestellt ;)
Das mit der Klasse is ne super Idee, das werd ich demnächst umsetzen. Und was hast du gegen die Exceptions, wie kan man doch dann abfangen und gucken was schief gegangen ist? Oder soll ich lieber sowas wie GetLastError und ein Boolean als Rückgabewert machen? Das mit dem 16xAA oder gar nich find ich eig nich so schlimm, da kamm man ja anstatt der 16 einen Wert aus den Einstellungen laden oder so, wo man dann 2, 4, 8 oder 16 hat. Der Fallback auf das normale Pixelformat ist ja nur falls iwas schief geht.

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: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 14:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Exceptions: Nun. Für mich sind Exceptions Ausnahmen. Also Fehler die man nicht berücksichtigt hat oder nicht berücksichtigen kann. Wenn ich also ein Eingabefeld habe in dem der Benutzer nur Zahlen zwischen 1-25 eintippe, dann ist '26' oder 'Blah' in meinen Augen keine Exception.

16x Antialiasing: Also ich habe eine Grafikkarte der neusten ATI Generation (wenn auch eine aus dem Mittelfeld) aber die kann meines Wissen nach kein 16x Antialiasing in Hardware direkt. Das Bild wäre dann auch in Wirklichkeit 4 Mal so breit und 4 mal so hoch. Das geht nur über irgendwelche Tricks im Treiber. Die Hardware AA geht nur bis maximal 8x.

Zum Thema Klasse. Klasse ist nicht gleich Klasse. Nur die Funktionen in eine Klasse zu kippen würde zwar meinem geschrieben Satz entsprechen aber nicht meiner Intension dahinter. Ich würde da auch eine andere Herangehensweise vorziehen. Eine die dem Entwickler auch nützt. Denn so wie es derzeit konzipiert ist trittst du es als Entwickler los und was dabei hinten entsteht entzieht sich vollkommen aus dem Einflussbereiches des Entwicklers. Und das ist meiner Meinung nach fatal in der Entwicklung. Da ist die dglOpenGL aber leider auch kein gutes Vorbild. Die Kontexterstellung darin ist stark angestaubt und mittlerweile auch reichlich überholt. Habe derzeit nur so mal überhaupt keine Zeit. Aber vielleicht finde ich demnächst mal ein paar Stunden.

Was das Wiki angeht. Damit man das vernünftig verstehen kann, würde ich den Code dort auch eher flach halten. Also nicht so wahnsinnig viele Spielerreien einbauen. Sondern erreicht man nur, dass die Leute den Code kopieren und nicht mehr verstehen was da eigentlich passiert. Das ist meiner Meinung nach sowieso schon zu oft der Fall.

PS: Was soll denn iwas für ein Wort sein? :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 14:51 
Offline
DGL Member
Benutzeravatar

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

also wäre es besser, wir schreiben nur den Code bzw. die Vorgehensweiße ins Wiki, der das AA ausliest und aktiviert, Fehlerbehandlung und Co kann dann ja derjenige machen, der den Code benutzt. Dabei muss er dann zwangsläufig den Code verstehen lernen, weil er ja noch damit arbeiten muss. Damit wäre auch die Copy&Paste-Geschichte gelöst.

MfG Bergmann.

p.s.: iwas = irgendwas, mach ich immer so, bin faul :P

_________________
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: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wiki: Na ja. Wie es letzten Endes gemacht wird ist mir egal. Ich habe mich nie groß ins Wiki eingemischt. Ich meinte aber auch nicht, dass jeder bis ins kleinste Detail wissen muss was dabei passiert. Sondern nur ein bisschen die groben Abläufe. Wichtig dabei ist meiner Meinung, dass es ein zweites Fenster geben muss und warum das so ist. Bzw wenn Code dann sollte er übersichtlich sein. Die einfachste Art für solch einen Code ist. Fenster erstellen. RC erstellen. Die Attributelist mit Werten befüllen. Pixelformate erfragen. Erste Pixelformat (Best Match) zurück eben. Das Format dann auf das richtige Fenster zuweisem und Kontext erstellen. Das ist eigentlich auch schon alles.

Und nein Einfach heißt nicht, dass einem der Code bei einem Fehler um die Ohren fliegen soll. ;) Er muss natürlich auf mögliche Ausnahmen reagieren. Er sollte nur keinen unnötigen Schnick Schnack enthalten. So etwas kann man machen, wenn man eine eigenständige Bibliothek/Unit macht. Mal sehen vielleicht finde ich ja demnächst mal die Zeit was für die dglopengl zu stricken.

iwas: Ich weiß was das bedeuten soll. Und ich weiß auch, dass du das immer so machst. Wollte damit nur durch die Blume sagen, dass ich das häßlich finde. :twisted: Deswegen auch das Stilmittel einer ironischen Frage.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Mi Jun 16, 2010 23:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Lossy eX hat geschrieben:
Exceptions: Nun. Für mich sind Exceptions Ausnahmen. Also Fehler die man nicht berücksichtigt hat oder nicht berücksichtigen kann. Wenn ich also ein Eingabefeld habe in dem der Benutzer nur Zahlen zwischen 1-25 eintippe, dann ist '26' oder 'Blah' in meinen Augen keine Exception.


Das ist eine astreine Exception. Schließlich zeigt das, dass hier jemand die Funktion ungültig aufruft. Das muss zurückgemeldet werden. Sowas zu verscheigen sorgt dafür, dass das ganze gebilde schwerer zu warten ist. In Java nennt sich die passende Exception "InvalidArgumentException".

Selbst wenn alle Parameter technisch im korrekten Wertebereich liegen, aber die kombination der Parameter fachlich nicht korrekt ist, sollte man eine Exception werfen. Noch wichtiger ist aber nicht nur mit Exceptions umsich zu werfen, sondern die "Nutzungsbedingungen" also die Doku der Funktion genau zu beschreiben.

Das Exceptionhandling im Code ist eigentlich genau richtig. Das einzige was man (aus Java Sicht) noch besser machen könnte, ist die Nutzung von "Assertions", falls ObjPascal sowas bietet. Die werfen am Ende auch nur ne Exception, zeigen aber, dass hier der zu erwartende Codeverlauf nicht mehr geht.

Was mich wundert ist, dass du(Lossy) das Exceptionhandling als falsch empfindest.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Do Jun 17, 2010 00:08 
Offline
DGL Member
Benutzeravatar

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

ich hab grad noch n Problem/Frage bei dem ich nich weiter komm und zwar: Wie deaktivier ich das Multisampling wieder, wenn ich ne scharfe Kante brauch (z.B. für ColorPicking). glDisable(GL_MULTISAMPLING) geht nich, das hab ich schon versucht und ich find leider auch nix anderes.

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: Supersampling
BeitragVerfasst: Do Jun 17, 2010 07:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Mich würde nun mal echt interessieren, wie bei Java die Exceptions verarbeitet werden, denn bei C++ gilt, nutze am besten garkeine Exception und ab kommender C++ ISO sind diese auch deprecated, da sie extrem probleme in Constructoren und Destructoren machen(ist dann verboten), memory leaks verusachen können(der code wird bis zum scope weiter ausgeführt und dann kommt der rollback, wobei entsprechend weitere exceptions auftreten, z.B. 0 pointer zugriff) und extrem langsam sind(da sie bis bis zum abfangen, der Exception, diese durch jeden Funktions- und Methodenaufruf mit durch gereicht werden). C verwendet Error Codes, bei der Rückgabe bzw. nutzt 0 Pointer und dieser weg wird bei c++ nun auch empfohlen.
Ist das verhalten bei Pascal und Java so anders ?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Do Jun 17, 2010 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Bergmann89 hat geschrieben:
Wie deaktivier ich das Multisampling wieder, wenn ich ne scharfe Kante brauch (z.B. für ColorPicking).
Da bin ich jetzt grade überfragt. Aber ich begebe mich auf die Suche. Ich sehe da aber schwarz. Das Multisampling stützt sich auf ein Pixelformat, und dieses wiederum ist eng mit dem Fenster verknüpft. Möglicherweise kann man das gar nicht ausschalten, ohne ein anderes Fenster zu erzeugen.

Inwiefern stört das AA beim Colorpicking? Ich hab hier in Linux nur Antialiasing, wenn ich es einfach auf der Grafikkarte aktiviere. Trotz eingeschaltetem AA bleiben scharfe Kanten aber erhalten. Aber ich verwende kein Colorpicking.

Tak2004 hat geschrieben:
Ist das verhalten bei >>Pascal<< und Java so anders ?
Erinnerst Du Dich nicht mehr? :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Do Jun 17, 2010 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Multisampling deaktivieren: Ich weiß nicht ob das wirklich so funktion. Laut Spezifikation ist mir auch so, dass man das deaktivieren können soll. Aber laut meinem Technikverständniss ist das nicht möglich. Denn Das Antialiasing wird ja glaube ich dadurch realisiert, dass intern ein wesentlich größerer Viewport erstellt wird als er sichtbar wäre. Entsprechend bei 4x AA würde pro Pixel 2x2 SubPixel erstellt werden. Diese werden dann auf die unterschiedlichsten Arten miteinander verrechnen. Selbst wenn man das Deaktiviert hätte wäre der Viewport immer noch so groß. Bei Colorpicking dürfest du dann aber auch nicht nur 1 Pixel auslesen sondern müsstest du einen Pixel Bereich auslesen und dann schauen welcher Wert am häufigsten darin vorkommt.

Exceptions: Flash du hast mein Beispiel missinterpretiert. Vielleicht war das Beispiel auch nicht klar genug beschrieben. Es ist vollkommen klar, wenn sich eine Methode in einer ausweglosen Situation befindet, dann kann das nur in einer Exception enden. Und da ist es meiner Meinung nach Wichtig wie man so etwas definiert. Ich hatte vor einigen Jahren mal eine Client/Server Software gebastelt. Und da habe ich doch allen ernstes eine Exception bekommen als der Server ganz normal legal die Verbindung getrennt hat. Die Exception sagte auch genau das aus. "Der Server hat erfolgreich die Verbindung getrennt". Ganz so schlimm ist das in Bergmans Code nicht. Allerdings bei jedem kleinen bisschen der Falsch laufen kann wird dort eine Exception ausgelöst. Was letzten Endes dazu führt, dass einige Stellen total abgekappselt sind. Zum Beispiel.
Code:
  try
    DeactivateRenderingContext;
  except
  end;

Was soll das? Zu mal ich mir an einigen Stellen eher ein Try Finally gewünscht hätte damit im Fehlerfall nicht irgendwas übrig bleibt. Besonders so erstellte Klassen sollten ein bisschen so gekappselt werden. Er hat zwar in der einen Methode 5x FreeAll drinne. Aber das erhöht nur die Wahrscheinlichkeit, dass das es freigegeben wird. Sicher ist es aber nicht. Und da ist es auch wieder so, dass ein normaler Status (von wglMakeCurrent) im Falle des nicht funktionierens eine Exception auslöst. Was im übrigen in anderen Methoden wieder ganz anders gelöst wird. Teils werden in dem Code auch selbst erzeugte Exceptions schlicht ignoriert.
Code:
  try
    PF := gluGetPixelFormat(Form.Handle, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
    RC := gluCreateRenderContext(Form.Handle, PF);
  except
    FreeAll;
    exit;
  end;

Bzw in TForm1.CreateRenderContext werden die Exceptions als Status benutzt. Wenn im ersten Versuch einen Kontext zu erstellen schon eine wirkliche Ausnahme stattfindet, dann ist das scheiß egal. Es wird einfach noch mal versucht. Es könnte da auch richtige Fehler auftretten. So System DLLs sind nicht da, Speicher Problem, Speicher voll etc. Abgesehen davon finde ich es ziemlich krautig "try except try except end end" direkt in einer Methode zu machen. Und Application.Terminate sollte man eventuell auch nicht einfach so machen. Der Benutzer der Anwendung würde sich vielleicht auch freuen, wenn er ein visuelles Feedback bekommt, warum die Anwendung einfach so verschwunden ist oder so.

Und ich habe ja auch nicht gesagt, dass ich gegen Exceptions bin. Ich bin nur gegen einen falschen Einsatz davon bzw einen übertrieben unnötigen Einsatz davon. Wie Tak schon sagte ist das Handling nicht übermäßig schnell. Delphi Exceptions sind da glaube ich nicht ganz so krass langsam wie das bei C++ der Fall zu sein scheint. Aber bremsen tun sie irgendwo natürlich auch. Das man das an einigen Stellen lieber in Kauf nehmen sollte ist auch klar. Ich geize damit schließlich auch nicht. Nur sollte man die Exceptions halt nicht inflationär einsetzen. Damit sorgt man zu mindest unter Delphi, dass echte richtige Fehler schnell mal untergehen können. Obendrein bin ich starker Debuggernutzer und dann ist solch ein Code einfach nur noch nervig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Do Jun 17, 2010 20:41 
Offline
DGL Member
Benutzeravatar

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

ich hab alles nochmal überarbeitet und ersucht alle angesprochenen Sachen umzusetzen. Hier das Resultat:
Code:
////////////////////////////////////////////////////////////////////////////////////////////////////
//gibt den ErrorCode des letzten Fehler zurück
//@result: ErrorCode des letzten Errors;
function gluGetLastError: Cardinal;
begin
  result := LastError;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
//gibt einen aussagekräftigen String passend zum ErrorCode zurück
//@ErrorCode: ErrorCode, der in einen String umgewandelt werden soll;
//@result: String mit Beschreibung zum Error;
function gluGetErrorString(ErrorCode: Cardinal): String;
begin
  case ErrorCode of
    ERROR_INIT_OPENGL     : result := 'Initializing OpenGL failed!';
    ERROR_NO_PIXELFORMAT  : result := 'No Pixelformat!';
    ERROR_CREATE_DC       : result := 'Creating Device Context failed!';
    ERROR_SET_PIXELFORMAT : result := 'Setting Pixelformat failed!';
    ERROR_CREATE_RC       : result := 'Creating Render Context failed!';
    ERROR_ACTIVATE_RC     : result := 'Activating Render Contect failed!';
    ERROR_NO_DC           : result := 'No Device Context!';
    ERROR_NO_RC           : result := 'No Render Context!';
    ERROR_AA_NOT_SUPPORTED: result := 'AntiAliasing not supported!';
    else                    result := 'noError';
  end;
  result := 'glUtils: '+result;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
//ermittelt alle Pixelformate, die MultiSampling unterstützen
//@PFList: Liste in die die Pixelformate geschieben werden;
//@SampleList: Liste in die die SampleRate passend zum Pixelformat geschrieben wird;
//@MaxCount: Maximale Länge der übergebenen Listen;
//@Count: Anzahl der gefundenen Pixelformate in der Liste;
function gluGetAntiAliasingPixelFormats(const PFList, SampleList: PglInt; const MaxCount: Integer; var Count: Integer): Boolean;
var
  //temporäres Fenster zum erzeugen des RC
  Form: TForm;
  //ARB_Erweiterung vorhanden
  //|          EXT_Erweiterung vorhanden
  MultiARBSup, MultiEXTSup: Boolean;
  //Liste der Integer Attribute
  IAtrib: array[0..18] of Integer;
  //Liste der Float Attribute (nur 0, da kein Wert)
  FAtrib: GLFloat;
  //temp. PixelFormat
  //| Schleifenvariable
  //| |  AttributName
  PF, i, QueryAtrib: Integer;
  //Zeiger auf zum hochzählen ni der Liste
  PPosiblePF, PSample: PglInt;
  //temp. RenderKontext
  //| RenderContext, der zurvor aktiviert war
  RC, OldRC: TgluRenderContext;
begin
  LastError := ERROR_NO_ERROR;
  result    := false;
  OldRC.DC  := wglGetCurrentDC;
  OldRC.RC  := wglGetCurrentContext;

  Form := TForm.Create(nil);
  PF := gluGetPixelFormat(Form.Handle, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  RC := gluCreateRenderContext(Form.Handle, PF);
  if RC.RC = 0 then begin
    Form.Free;
    exit;
  end;
  if not gluActivateRenderContext(RC) then begin
    Form.Free;
    gluDestroyRenderContext(RC);
    exit;
  end;

  //Pixelformate mit AA auslesen
  MultiARBSup := false;
  MultiEXTSup := false;
  if WGL_ARB_extensions_string and
     WGL_ARB_pixel_format and
     (WGL_ARB_MULTISAMPLE or GL_ARB_MULTISAMPLE) then
    multiARBSup := true;
  if WGL_EXT_extensions_string and
     WGL_EXT_pixel_format and
     (WGL_EXT_MULTISAMPLE or GL_EXT_MULTISAMPLE) then
    multiEXTSup := true;

  if multiARBSup then
    Read_WGL_ARB_pixel_format
  else if multiEXTSup then   
    Read_WGL_EXT_pixel_format;

  if not (MultiARBSup or MultiEXTSup) then begin
    Form.Free;
    gluDestroyRenderContext(RC);
    LastError := ERROR_AA_NOT_SUPPORTED;
    exit;
  end;

  FAtrib     := 0;
  IAtrib[00] := WGL_DRAW_TO_WINDOW_ARB;
  IAtrib[01] := 1;
  IAtrib[02] := WGL_SUPPORT_OPENGL_ARB;
  IAtrib[03] := 1;
  IAtrib[04] := WGL_DOUBLE_BUFFER_ARB;
  IAtrib[05] := 1;
  IAtrib[06] := WGL_PIXEL_TYPE_ARB;
  IAtrib[07] := WGL_TYPE_RGBA_ARB;
  IAtrib[08] := WGL_COLOR_BITS_ARB;
  IAtrib[09] := 32;
  IAtrib[10] := WGL_ALPHA_BITS_ARB;
  IAtrib[11] := 0;
  IAtrib[12] := WGL_DEPTH_BITS_ARB;
  IAtrib[13] := 24;
  IAtrib[14] := WGL_STENCIL_BITS_ARB;
  IAtrib[15] := 0;
  IAtrib[16] := WGL_SAMPLE_BUFFERS_ARB;
  IAtrib[17] := 1;
  IAtrib[18] := 0;

  if multiARBSup then
    wglChoosePixelFormatARB(RC.DC, @IAtrib, @FAtrib, MaxCount, PFList, @Count)
  else if multiEXTSup then
    wglChoosePixelFormatEXT(RC.DC, @IAtrib, @FAtrib, MaxCount, PFList, @Count);

  if Count > MaxCount then
    Count := MaxCount;

  QueryAtrib := WGL_SAMPLES_ARB;
  PSample    := SampleList;
  PPosiblePF := PFList;
  for i := 0 to Count-1 do begin
    if multiARBSup then
      wglGetPixelFormatAttribivARB(RC.DC, PPosiblePF^, 0, 1, @QueryAtrib, PSample)
    else if multiEXTSup then
      wglGetPixelFormatAttribivEXT(RC.DC, PPosiblePF^, 0, 1, @QueryAtrib, PSample);
    inc(PSample);
    inc(PPosiblePF);
  end;

  Form.Free;
  gluDestroyRenderContext(RC);
  result := True;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
//erstellt einen RenderContext mit dem übergebenen PixelFormat. Wenn das angegebene
//AntiAliasing Pixelformat nicht unterstützt wird der 0 ist, erfolgt automatisch
//ein FallBack auf das normale PixelFormat
//@Handle: Handle für das der RenderContext erzeugt werden soll;
//@PixelFormat: FallBack-PixelFormat falls AAPixelFormat 0 oder nicht gültig;
//@AAPixelFormat: Pixelformat mit aktiviertem AntiAliasing;
//@result: Device- und erzeugter RenderContext, für das übergebene Handle;
function gluCreateRenderContext(const Handle: HWND; const PixelFormat: Integer): TgluRenderContext;
begin
  LastError     := ERROR_NO_ERROR;
  result.DC     := 0;
  result.RC     := 0;
  result.Handle := 0;

  if GL_LibHandle = nil then
    if not InitOpenGL then begin
      LastError := ERROR_INIT_OPENGL;
      exit;
    end;

  if PixelFormat = 0 then begin
    LastError := ERROR_NO_PIXELFORMAT;
    exit;
  end;

  result.Handle := Handle;
  result.DC := GetDC(Handle);
  if result.DC = 0 then begin
    LastError := ERROR_CREATE_DC;
    exit;
  end;

  if not SetPixelFormat(result.DC, PixelFormat, nil) then begin
    ReleaseDC(result.Handle, result.DC);
    LastError := ERROR_SET_PIXELFORMAT;
    exit;
  end;

  result.RC := wglCreateContext(result.DC);
  if result.RC = 0 then begin
    ReleaseDC(result.Handle, result.DC);
    LastError := ERROR_CREATE_RC;
    exit;
  end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
//gibt den RenderContext frei
//@RC: RenderContext der freigegeben werden soll;
procedure gluDestroyRenderContext(const RC: TgluRenderContext);
var CurrentRC: HGLRC;
begin
  CurrentRC := wglGetCurrentDC;
  if CurrentRC <> 0 then
    DeactivateRenderingContext;
  if RC.RC <> 0 then
    DestroyRenderingContext(RC.RC);
  if RC.DC <> 0 then
    ReleaseDC(RC.Handle, RC.DC);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
//Aktiviert einen RenderContext
//RC: RenderContext der aktiviert werden soll;
function gluActivateRenderContext(const RC: TgluRenderContext): Boolean;
begin
  result := false;
  LastError := ERROR_NO_ERROR;
  if RC.DC = 0 then begin
    LastError := ERROR_NO_DC;
    exit;
  end;
  if RC.RC = 0 then begin
    LastError := ERROR_NO_RC;
    exit;
  end;
  if not wglMakeCurrent(RC.DC, RC.RC) then begin
    LastError := ERROR_ACTIVATE_RC;
    exit;
  end;
  ReadImplementationProperties;
  ReadExtensions;
  result := true;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.CreateRenderContext;
var
  PF: Integer;
  PFList, SampleList: array[0..15] of Integer;
  i, Count: Integer;

  function GetMaxAAPF: Integer;
  var max, max_i, i: Integer;
  begin
    max_i := 0;
    max   := 0;
    for i := 0 to Count-1 do
      if max < SampleList[i] then begin
        max := SampleList[i];
        max_i := i;
      end;
    result := PFList[max_i];
  end;   

begin
  for i := 0 to 15 do begin
    PFList[i]     := 0;
    SampleList[i] := 0;
  end;
  Count := 0;

  if not gluGetAntiAliasingPixelFormats(@PFList[0], @SampleList[0], Length(PFList), Count) then begin
    MessageDLG('Can''t create RenderContext with AA enabled. ErrorMessage: "' +
       gluGetErrorString(gluGetLastError) + '". Try Fallback to normal RenderContext!', mtWarning, [mbOK], 0);
  end else begin
    PF := GetMaxAAPF;
    RC := gluCreateRenderContext(RenderPanel.Handle, PF);
    if RC.RC = 0 then begin
      MessageDLG('Can''t create RenderContext with AA enabled. ErrorMessage: "' +
        gluGetErrorString(gluGetLastError) + '". Try Fallback to normal RenderContext!', mtWarning, [mbOK], 0);
    end;
  end;

  if RC.RC = 0 then begin
    PF := gluGetPixelFormat(RenderPanel.Handle, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
    RC := gluCreateRenderContext(RenderPanel.Handle, PF);
    if RC.RC = 0 then begin
      MessageDLG('Can''t create RenderContext with normal PixelFormat. ErrorMessage: "' +
        gluGetErrorString(gluGetLastError) + '". Application terminated!', mtError, [mbOK], 0);
      Application.Terminate;
    end;
  end;
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: Supersampling
BeitragVerfasst: Fr Jun 18, 2010 08:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also einige Dinge die ich angesprochen habe wurden zwar umformuliert aber in keiner Weise berücksichtigt. Ich habe keine Lust das noch mal zu wiederholen entsprechend verweise ich auf meine vorherigen Posts. Aber im Endeffekt habe ich mit dem Code eh nix zu schaffen entsprechend ist es mir auch ziemlich egal.

TForm1.CreateRenderContext: Das ist jetzt nicht dein Ernst? Als ich gesagt habe, dass du die Anwendung nicht ohne Meldung abschießen solltest da meinte ich das auch genau so. Ich habe damit nicht gemeint, dass du Benutzer deiner Anwendung mit Meldungen gängeln sollst. Ich weiß nicht ob die Meldungen '... Try Fallback to normal RenderContext!' jetzt irgendwie sarkastisch, ironisch oder ernst gemeint sind. Allerdings interessiert das ja nun echt niemanden, dass dein Code eine andere if Verzeigung probiert. Und im Falle, dass die Karte des Benutzers so etwas nicht kann oder sonst was pasiert, kann es ja nicht Sinn und Zweck sein, dass diese Leute jedes Mal so eine Meldung sehen.

Selbst wenn das auf deinem Rechner nicht passiert solltest du doch mal drüber nachdenken was dein Code auf anderen Rechnern macht, wenn die Gegebenheiten vielleicht ein bisschen anders sind als auf dem System auf dem du deine Programme erstellst. Denn genau da liegen die echten Schwierigkeiten beim Programmieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Supersampling
BeitragVerfasst: Fr Jun 18, 2010 09:33 
Offline
DGL Member
Benutzeravatar

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

Umsetzung: Wieso? Exceptions sind raus, ordentlichen Rückgabewert und Möglichkeiten um an den Fehler ran zu kommen. Das einzige, was ich nicht umgesetzt hab ist die Klasse, weil man ja mit dem Aufruf der Funktion alle Werte bekommt, die man benötigt. Also muss ich die auch nur einmal aufrufen.

TForm1.CreateRenderContext: Warum ich das gemacht hab hat 2 Gründe: 1. Teilweiße um zu gucken obs so funktioniert. Ich weiß das geht auch mit dem Debuger, aber der Debuger funktionniert nicht mit ner EXE und so konnte ich ohne weiteres auf anderen Rechner gucken obs geht, ohne ein extra DebugTool zu installieren.
Der 2. Grund war, das man zu dem Programm noch ein Einstellungsmenü hat, wo man das AA aktivieren kann (da werden nur die unterstützen Formate angeboten). Und ich als Benutzer wüsste schon gern, warum das AA nich an is, obwohl ich es eingeschaltet hatte. Das Stand zwar nicht mit im Code, aber das erklärt hoffentlich meine Beweggründe.
Aber um den Code gehts ja auch gar nich (wie du schon gesagt hast). Das wichtige is, das die Methoden für das AA richtig arbeiten und ordentlich designed sind. Die CreateRenderContext war nur drin, um zu zeigen wie man es benutzen muss.

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: Supersampling
BeitragVerfasst: Fr Jun 18, 2010 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Meldungen: Nicht jeder der deine Anwendung benutzt muss ein Software Entwickler sein. Es soll leute geben die wären durch Meldungen wesentlich verwirrter als wie wenn sich eine Option nicht auswirken würde. Vor allem, da die Meldungen nicht mal für jeden Entwickler verständlich wäre. Es ist aber deine Anwendung.

Ja der Code ist besser als vorher. Nein ich reite nicht auf Klassen herum. Ja ich finde die herangehensweise deines Codes nach wie vor unnötig kompliziert und der Code gewährt dem Entwickler nur ein Pseudogefühl darüber die Kontrolle zu besitzen. Ich habe schon mehr dazu gesagt als ich eigentlich wollte. Was du daraus machst ist mir nahezu vollkommen egal.

PS: AntiAliasing von 1 hat man immer. Wie das in deinen Code passt darfst du gerne als kleines Rätsel sehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]