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

Aktuelle Zeit: Fr Jul 18, 2025 22:13

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 07, 2009 11:37 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Lossy eX hat geschrieben:
Der Code erstellt einen RenderingContext und erfragt mit Hilfe der Erweiterung WGL_ARB_pixel_format und GL_ARB_multisample ob ein RenderContext mit AntiAliasing verfügbar ist. Die Methode gibt dabei das PixelFormat des entsprechenden Formates zurück. PixelFormate sind Zahlen mit denen ein Format im Treiber verknüpft ist. Also 16 Bit Farbtiefe mit 16 oder 32 Bit Tiefenbuffer. 32 Bit Farbtiefe etc etc etc. Und da gibts eben auch die Formate mit AntiAliasing.

Diese ID die du da zurück bekommst musst du mit Hilfe von SetPixelFormat an dein Formular zuweisen. So etwas geht nur ein einziges Mal. Deswegen erstellt die Methode auch ein temporäres Formular. Wenn du das PixelFormat zugeweisen hast musst du mit wglCreateContext einen Kontext erstellen. Wie das genau abläuft solltest du in den Tutorials 1 bereits gelernt haben ;) bzw. die Methode CreateRenderingContext aus der dglOpenGL ist auch gut zum Nachschlagen.

Mit ActivateRenderingContext aus der dglOpenGL solltest du den erstellten Context dann noch aktivieren. Dann werden auch die anderen Funktionspointer innerhalb des Headers geladen.


Also gibt diese Funtkion ein PixelFormat zurrück, was bei der Grafikkarte das AA aktiviert?

Ich weise das also dem Pixelformat zu mit SetPixelFormat.
Der zweite Parameter ist ja dann die (verlinkte) Funktion.
Doch was sind der erste und dritte? Und was kommt darein?

Die Zeile
Code:
  1. RC:=CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
muss dann weg und die neuen drei an diese Stelle oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 10, 2009 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Entschuldige. Ich hatte deine Frage vollkommen verpennt. Die Intension hinter meinem Post war, dass du dir mal die Methode CreateRenderingContext genau anschaust. Also was dort innendrinne passiert. Aber dann mal kurz eine Erklärung dazu.

Als Erstes wird eine Struktur gefüllt. Und zwar wird in den TPixelFormatDescriptor geschrieben welche Eigenschaften dein Kontext besitzen soll. Anschließen wird mit ChoosePixelFormat ein Pixelformat ausgewählt. Dieses PixelFormat wird mit SetPixelFormat auf dein Formular zugewiesen. Als krönender Schluss wird mithilfe von wglCreateContext ein Kontext erstellt. Das alles passiert in CreateRenderingContext.

Die Methode von Lord Horazont ersetzt (erweitert) die Schritte zur Auswahl eines Pixelformates. Also das Befüllen von TPixelFormatDescriptor und das Auswählen mittels ChoosePixelFormat. Entsprechend müsste deine Änderung so aussehen, dass du CreateRenderingContext durch die Methode von Lorz Horazont ersetzt. Und anschließend SetPixelFormat und wglCreateContext aufrufst. Wie du das aufrufst schau dir bitte erst mal in CreateRenderingContext an. Den Befehl DescribePixelFormat kannst du dabei ignorieren. Der würde nur detailierte Informationen zu dem PixelFormat einholen. Das sind nur Infos für den Entwickler, wenn sie denn sinnvoll ausgewertet werden würden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 12, 2009 10:25 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Hilf mir doch mal bitte ein bisschen bei dem Code...

Es muss also so aussehen:

Code:
  1.   DC:=GetDC(panel.Handle);
  2.   RC:= GetMultisamplePixelFormat;

Dann kommt Setpixelformat. Mit welchen Parametern???

Dann
Code:
  1.   wglcreatecontext(RC);

Muss der Rendering Context nicht noch aktiviert werden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 12, 2009 11:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Das da:
Code:
  1. RC:= GetMultisamplePixelFormat;

ist falsch, denn das PixelFormat und der RC sind NICHT das Gleiche.

Hier ein Beispiel von mir, das mal in Windows 2000 funkitoniert hat. In XP habe ich es noch nicht ausprobiert.
Code:
  1. //********************************************************************
  2. Function osRC_CreateExtended(AWindow: TuInt32): TuInt32;
  3. Var
  4.    DC,RC: TuInt32;
  5.    PixelFormatRec: TPixelFormatDescriptor;
  6.    PixelFormat: TInt32;
  7. Begin
  8.    Result:= 0;
  9.  
  10.    With PixelFormatRec Do Begin
  11.       nSize       := SizeOf(PixelFormatRec);
  12.       nVersion    := 1;
  13.       dwFlags     := PFD_SUPPORT_OPENGL;
  14.       dwFlags     := dwFlags OR PFD_DRAW_TO_WINDOW;
  15.       dwFlags     := dwFlags OR PFD_DOUBLEBUFFER;
  16.       iPixelType  := PFD_TYPE_RGBA;
  17.       cColorBits  := 32;
  18.       cDepthBits  := 24;
  19.       cStencilBits:= 0;
  20.       cAccumBits  := 0;
  21.       cAuxBuffers := 0;
  22.       iLayerType  := 0;
  23.    End;
  24.  
  25.    DC:= GetDC(AWindow);
  26.  
  27.    PixelFormat:= PixelFormatInfo.MultiSamplePixelFormat;
  28.  
  29.    If PixelFormat <> 0
  30.       Then Begin
  31.          SetPixelFormat(DC,PixelFormat,@PixelFormatRec);
  32.          DescribePixelFormat(DC,PixelFormat,
  33.                        SizeOf(PixelFormatRec),PixelFormatRec);
  34.          RC:= wglCreateContext(DC);
  35.  
  36.          If (DC <> 0) And (RC <> 0) Then Begin
  37.             wglMakeCurrent(DC,RC);
  38.             Result:= RC;
  39.          End;
  40.       End;
  41. End;


Hinweis: PixelFormatInfo.MultiSamplePixelFormat ist ein DatenTyp, der das vorher ermittelte Multisample-Pixelformat enthält.

Ob und wie das Ganze für eine Delphi-Form funktioniert, weiß ich nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 12, 2009 12:22 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Warum ist das denn so kompliziert....

Also das ist der ursprüngliche Code aus dem Tutorial:
Code:
  1.   DC:=GetDC(Handle);
  2.   RC:=CreateRenderingContext(DC,          //Device Contest
  3.                              [opDoubleBuffered], //Optionen
  4.                              32,          //ColorBits
  5.                              24,          //ZBits
  6.                              0,           //StencilBits
  7.                              0,           //AccumBits
  8.                              0,           //AuxBuffers
  9.                              0);          //Layer
  10.   ActivateRenderingContext(DC, RC);
  11.  


Wie muss ich den jetzt abändern, damit ich mit GetMultisamplePixelformat dann mein geglättetes Bild bekomme?

(Ich weis es ist nicht sinnvoll, fertigen Code zu posten, aber wir können doch mal eine Ausnahme machen.... Verstehen kann ichs danach ja immernoch)

Sollte übrigens erstmal unter Vista funktionieren und auf ein panel gerendert werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 12, 2009 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Schau mal da rein.
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=46
Ganz am Ende findest du dann auch eine Delphi Umsetzung.

_________________
"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: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 18:00 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
... es ist zwar schon länger her, aber ich habe es bis jetzt noch nicht hinbekommen mit dem Antialiasing.
Es wurde ja auch eine einfachere, weniger elegante Methode vorgeschlagen.
Das ganze Zeugs einfach auf eine Textur rendern und die dann verkleinern.
Könnt ihr mir sagen wie ich den Quellcode dafür abändern muss?
Ich hab noch nicht wirklich viel mit OpenGL gemacht, und das vor Monaten...
In welchem Tutorial ist das beschrieben, was ich hierzu brauche?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 18:32 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Um mal eins klarzustellen: Antialiasing ist nicht gleich Antialiasing. Das mit dem Rendern in einer höheren Auflösung und anschließendem Runterskalieren heißt Supersampling. Es kostet sehr viel Leistung (wie man sich denken kann) und meiner Erfahrung nach sieht das Bild danach auch etwas unscharf aus.

Deutlich Resourcen-schonender ist das Multisampling, bei dem nur für die Polygon-Kanten zusätzliche Pixel gerendert werden. Dazu bieten die Treiber idR noch die Option, das nicht nur an den Kanten zu tun, sondern auch auf Flächen mit Alpha-Testing (und -Blending?). Nvidia nennt das "transparentes" Anitaliasing und ATI "adaptives" Antialiasing. Was Nvidia mit dem Coverage Sampling genau meint, habe ich wieder vergessen, jedenfalls wollen die damit bei mehr Leistung bessere Qualität rausschlagen.

In der c't gab's mal nen netten Artikel über die verschiedenen Formen von Antialiasing.

Edit: Oh, ich hab gar nicht gesehen, dass es eine zweite Seite gibt... :oops:

Gruß mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:08, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 18:39 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
Das von dir angesprochene Verfahren findet vor allem in renderern mit Deferred Shading Einsatz (wie bei Stalker). Bei Forward-Renderen ist Hardware-AA einiges sinnvoller.

Edit: Ich habe die zweite Seite auch übersehen. Mein Post bezog sich auf den letzten Eintrag von Seite 1 :oops:

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Zuletzt geändert von igel457 am Fr Mär 12, 2010 20:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 18:44 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Das mit diesen ganzen vielen Multisampling zeugs hat ja dann doch nicht funktioniert.

Es ist halt nur ein kleines Programm mit 54 einfachen polygonen, hohe framerate ist mir nicht so wichtig, ist auch nicht fullscree. ich möchte einfach, dass es ein bischen hübscher aussieht weil mir dieser stufen look nicht so gefällt.

ich suche also nach einer einfach zu programmierenden methode...

zu igel:
lies dir mal die vorposts durch...
hardware aa hab ich tausendmal probiert und es klappt eben doch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 20:55 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Wenn du dein Programm hübsch haben willst, würde ich nicht Supersampling benutzen. Wie ich schon schrieb, wird das Bild dabei (zumindest bei meiner Radeon) etwas unscharf, sodass ich lieber ganz ohne Antialiasing rendern würde. Das ist aber sicherlich Geschmackssache. :)


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:09, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 22:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ne simple Methode, die aber langsam ist, ist das Multipass-Verfahren.

Du renderst deine Szene n (n=4 oder 6) mal mit aktiviertem Blending und geringer Intensität (Alpha = 1/n).
Bei jedem Pass bewegst du deine "Kamera" um 1Pixel um den eigentlichen Standort herum.

Am Ende jedes Durchgangs löscht du den Tiefenpuffer und beginnst mit dem nächsten Durchgang

Das klingt recht aufwändig - und ist entsprechend langsam.

Das mit dem "Rotieren der Kamera um einen Punkt" könnte man vielleicht mit gluLookAt relativ easy hinbekommen.

PS: Das was ich hier geschrieben hab, ist quasi aus dem Kopf und ungetestet.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: Fr Mär 12, 2010 22:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
PS: Das was ich hier geschrieben hab, ist quasi aus dem Kopf und ungetestet.

Ähm, das dürfte nicht den gewünschten Effekt erzielen. Was du da beschreibst ist eine Art Weichzeichner, allerdings einer der Artefakte erzeugt, weil eben nur der einfache Durchschnitt der Pixelfarben (1/n) berechnet wird. Würde man aber auch erst bei größerem n sehen. Der Grund für die Artefakte sind die mathematischen Eigenschaften der Durchschnittsfunktion bei einer Fouriertransformation. Will ich jetzt nicht darauf eingehen, weil hier unwichtig. Jedenfalls mit einer Gaußfunktion gibt es keine Artefakte, weil die Gaußfunktion nach der Fouriertransformation wieder eine Gaußfunktion ist. ABER...ein Weichzeichner war ja hier gar nicht gewünscht...

Für Antialiasing braucht es eine höhere Auflösung pro Pixel...Subpixel eben. Diese Subpixel werden dann zu einem Pixel zusammengefasst.

Das einfachste ist das erwähnte Supersampling, insbesondere weil es überall funktioniert...ich kenne das eigentlich unter dem Namen FSAA (FullSceneAntialiasing). Der Trick ist die Szene einfach mit 2x, 4x, 8x oder gar 16x größerer Auflösung in ein FBO zu rendern und dann runterzuskalieren. Wichtig: Es müssen 2er-Potenzen sein, sonst wird es unscharf. Bei 2x kommen z.B. genau 2x2 Pixel auf einen Pixel, daher bleibt das Bild scharf. Es sollte klar sein das der Aufwand quadratisch ist, also bei 16x müssen 256mal soviele Pixel gerendert werden. Hier kommt dann Deferred Shading zum Einsatz um z.B. Lichteffekte mit geringerer Auflösung zu berechnen. Licht wird normal mit 1x berechnet und dann mit dem 16x Bild kombiniert.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: So Mär 14, 2010 10:33 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Also aus dem FBO Tutorial werde ich nicht so richtig schlau...

Wie wird denn das FBO später abgebildet, wenn alles darein gerendert wurde?
Und wo kann man die Größe eingeben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anti-Aliasing
BeitragVerfasst: So Mär 14, 2010 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Mittels FBO kannst du in eine Textur rendern. Diese Textur kann wie jede andere Textur verwendet werden, sobald du den FBO wieder abschaltest. Die Größe entspricht logischerweise der Größe der Textur.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]