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

Aktuelle Zeit: Di Jul 08, 2025 00:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 09:58 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moinsen,

ich bin auf der Suche nach einer Möglichkeit AA für meine Simulation hinzubekommen. Ich rendere meine Szene in einen GBuffer mit MRT, daher funktioniert ja das "normale" hardware seitige FSAA nicht.. Irgendwie hab ich was von MultiSample FBO gehört.. Wie funktioniert sowas?

Grüße
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 13:32 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Gibt's da nicht Beispiele im NVidia OpenGL SDK? (Nur weil NVidia draufsteht heißt es noch lange nicht das es für AMD auch nicht funzt)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Da habe ich bislang schon über sehr vielfältige Ansätze gelesen.
Angewandt hab ich sie noch nicht, soweit bin ich noch nicht.

Die Möglichkeiten gehen von Multisampling bis Postfiltereffekt.

Onkel Google hat da einiges parat. Wobei ich das PDF und den Gamedev-Artikel recht interessant finde.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Der wohl bekannteste Ansatzt ist MSAA.
Hier die implementierung von Killzone.
http://www.dimension3.sk/mambo/Download-document/Deferred-Rendering-In-Killzone.php

_________________
"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: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 18:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
State of the Art scheint wohl gerade FXAA zu sein, siehe
http://www.geeks3d.com/20110405/fxaa-fa ... geforce/3/
bzw.
viewtopic.php?f=4&t=10167

Habe mich aber noch nicht damit beschäftigt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Do Jan 26, 2012 19:52 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
habe so ein FXAA teil schon implementiert, doch was vorher schon extrem zerfetzt in den Shader kommt, lässt sich im nachhinein schlecht wieder schön machne... bzw nur bedingt.. und die Kanten sehen dann extrem wischiwaschi aus..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Mo Jan 30, 2012 11:48 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hab hier nen GPAA Shader gefunden. Das ist denk ich mal eher was ich suche.. dieses Postprozessing zeugs taugt irgendwie nix.. Kanten sind immer verwaschen..

Kann mir da jemand helfen den in GLSL zu übersetzten??

Code:
  1.  
  2.  
  3. struct VsIn
  4. {
  5.     float3 Position0 : Position0;
  6.     float3 Position1 : Position1;
  7. };
  8.  
  9. struct PsIn
  10. {
  11.     float4 Position : SV_Position;
  12.  
  13.     // The parameters are constant across the line so use the nointerpolation attribute.
  14.     // This is not necessarily required, but using this we can make the vertex shader slightly shorter.
  15.     nointerpolation float4 KMF : KMF;
  16. };
  17.  
  18. [Vertex shader]
  19.  
  20. float4x4 ViewProj;
  21. float4 ScaleBias;
  22.  
  23. PsIn main(VsIn In)
  24. {
  25.     PsIn Out;
  26.  
  27.     float4 pos0 = mul(ViewProj, float4(In.Position0, 1.0));
  28.     float4 pos1 = mul(ViewProj, float4(In.Position1, 1.0));
  29.  
  30.     Out.Position = pos0;
  31.  
  32.     // Compute screen-space position and direction of line
  33.     float2 pos = (pos0.xy / pos0.w) * ScaleBias.xy + ScaleBias.zw;
  34.     float2 dir = (pos1.xy / pos1.w) * ScaleBias.xy + ScaleBias.zw - pos;
  35.  
  36.     // Select between mostly horizontal or vertical
  37.     bool x_gt_y = (abs(dir.x) > abs(dir.y));
  38.  
  39.     // Pass down the screen-space line equation
  40.     if (x_gt_y)
  41.     {
  42.         float k = dir.y / dir.x;
  43.         Out.KMF.xy = float2(k, -1);
  44.     }
  45.     else
  46.     {
  47.         float k = dir.x / dir.y;
  48.         Out.KMF.xy = float2(-1, k);
  49.     }
  50.     Out.KMF.z = -dot(pos.xy, Out.KMF.xy);
  51.     Out.KMF.w = asfloat(x_gt_y);
  52.  
  53.     return Out;
  54. }
  55.  
  56. [Fragment shader]
  57.  
  58. Texture2D BackBuffer;
  59. SamplerState Filter;
  60.  
  61. float2 PixelSize;
  62.  
  63. float4 main(PsIn In) : SV_Target
  64. {
  65.     // Compute the difference between geometric line and sample position
  66.     float diff = dot(In.KMF.xy, In.Position.xy) + In.KMF.z;
  67.  
  68.     // Compute the coverage of the neighboring surface
  69.     float coverage = 0.5f - abs(diff);
  70.     float2 offset = 0;
  71.  
  72.     if (coverage > 0)
  73.     {
  74.         // Select direction to sample a neighbor pixel
  75.         float off = (diff >= 0)? 1 : -1;
  76.         if (asuint(In.KMF.w))
  77.             offset.y = off;
  78.         else
  79.             offset.x = off;
  80.     }
  81.  
  82.     // Blend pixel with neighbor pixel using texture filtering and shifting the coordinate appropriately.
  83.     return BackBuffer.Sample(Filter, (In.Position.xy + coverage * offset.xy) * PixelSize);
  84. }
  85.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Mo Jan 30, 2012 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Dann solltest du auf super sampling setzten und das ganze in höheren Auflösungen rendern und anschliessend in zielauflösung den FBO rendern.
Das ist nicht gerade die Performanteste Methode aber dafür hast du platformunabhängige Kantenglättung, die wesentlich besser aus sieht.

Das ist ein CG Shader, denn kannst einfach durch den CG Toolkit compiler laufen lassen und der spuckt dir glsl aus.

_________________
"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: FBO + MRT + Antialising
BeitragVerfasst: Di Jan 31, 2012 06:57 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
das gute ist ja, das ICH die Hardware vorgebe. Also wenn die Software die neuste GTX590 benötigt dann is das halt so. Hauptsache es läuft flüssig und sieht geil aus. Zudem ist AA bei mir nur fürs Videorendering interessant. Echtzeit wäre schön, aber Quali hat Vorrang.

Ich hab schon bisschen gesucht wegen MultiSampling doch noch nicht verstanden wie ich das wirklich angehen soll. Ich hab ja mehrere ColorAttachments, 3 um genau zu sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Di Jan 31, 2012 14:12 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
wie ist das mit dem Blitten.. soweit ich das verstehe wird ja da von MultiSample wieder zurück auf "normale" Textur runtergerechnet und dabei das Antialising durchgeführt. Korrekt? Nun hätte ich mein FBO mit mehreren Attachments dran, wo ich meine Szene reingerendert habe.

Muss ich jetzt ein weiteres FBO erstellen, mit gleicher anzahl an Attachments, jedoch ohne MultiSample und dann in das FBO blitten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Di Jan 31, 2012 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Du kannst, sofern die Auflösung unterstützt wird es direkt in der hohen Auflösung in den FBO rendern, sonnst musst du in mehreren Schritten und den Viewport Settings das Bild in den FBO rein rendern(solche Funktionen haben viele Titel, da man so auch HighRes Screenshots und PR Grafiken raus rendert).
In einem 2. Pass wird dann das FBO als Textur verwendet und auf ein Quad in der lowres Auflösung gerendert.
Das Bilineare Filtering tut dann den rest.
Solltest du vor haben, tiefenunschärfe zu wollen, dann brauchst du auch die MipMaps und dann kann man auch trilineares filtering verwenden.
Für deferred shading ist die Technik noch ein Stück unangenehmer, da man alle Rendertargets in der hohen Auflösung rendern muss, damit nicht unangenehme Artefakte an den Kanten entstehen.
Das nennt sich super sampling, multi sampling ist eigentlich das Bild mehrmals in unterschiedlichen pixelverschiebungen(+-0.5 auf beiden Achsen) zu rendern und dann die Ergebnisse zu mischen.

Leider gibt es soviele Techniken für Software AA, dass es schon Forenthreads gibt, in den man sich über die Abkürzungen lustig macht und die Liste ist dann auch mal gut 20 Einträge lang.

_________________
"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: FBO + MRT + Antialising
BeitragVerfasst: Di Jan 31, 2012 21:17 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nun ein MSAA bei nem FBO mit nur einem ColorAttachment hab ich das schon zum laufen gebracht und ich finde das sieht auch super aus. Doch ich bekomms nicht hin das alle Rendertargets geblitttet werden. So hab ichs bisher versucht:

Ergebnis ist das ich die Szene nur ohne AA im Attachment 0 sehe.. bei den restlichen kommt nur Müll raus. Was mach ich da verkehrt? Funktionieren muss das irgendwie, der kollege hier hats wohl auch hinbekommen: http://www.spieleprogrammierer.de/15-2d ... bo-mrt-ms/



Code:
  1.  
  2. procedure TMultiSampleFBO.Bind;
  3. begin
  4.   inherited;
  5.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Container);
  6.    glPushAttrib(GL_VIEWPORT_BIT);
  7.    glViewport(0,0,Width,Height);
  8.  
  9.    glClearColor(1,0,0,1);
  10.    glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
  11.  
  12. end;
  13.  
  14. function TMultiSampleFBO.Generate(Attachments: Integer; const MRTcount,
  15.   Texis32BitIdx: Integer): Boolean;
  16. var
  17.   I: Integer;
  18.     FBOState: TuInt32;
  19. begin
  20. setLength(tex, Attachments);
  21. setLength(ColorBuffers, Attachments);
  22. // Multi sample colorbuffer
  23. for I := 0 to high(tex) do
  24.  begin
  25.   glGenRenderbuffersEXT(1, @colorBuffers[i]);
  26.   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, colorBuffers[i]);
  27.   glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_RGBA, width, height);
  28.  end;
  29.  
  30. // Multi sample depth buffer
  31. glGenRenderbuffersEXT(1, @depthBufferID);
  32. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBufferID);
  33. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_DEPTH_COMPONENT, width, height);
  34.  
  35. // Attach them
  36. glGenFramebuffersEXT(1, @Container);
  37. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Container);
  38. for I := 0 to high(Tex) do
  39.  begin
  40.   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_RENDERBUFFER_EXT, colorBuffers[i]);
  41.  end;
  42. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBufferID);
  43.  
  44.  
  45.  
  46. //Final FBO
  47.  glGenFramebuffersEXT(1, @finalFBO);
  48.  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FinalFBO);
  49.  
  50.  
  51.  
  52. // Final framebuffer color buffer
  53.  for I := 0 to high(tex)  do
  54.   begin
  55.    glGenTextures(1, @tex[i]);
  56.    glBindTexture(GL_TEXTURE_2D, tex[i]);
  57.    glTexImage2D(GL_TEXTURE_2D, 0,        // Set properties
  58.          GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NIL);
  59.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  60.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  61.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  62.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  63.  
  64.    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, tex[0], 0);
  65.   end;
  66.  
  67.  
  68.     FBOState:= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  69.       If FBOState = GL_FRAMEBUFFER_COMPLETE_EXT
  70.       Then Result:= TRUE
  71.       Else Result:= FALSE;
  72.  
  73.     if result = false then
  74.       ShowmessagE('FBO Incomplete');
  75.  
  76.  
  77.  glBindTexture(GL_TEXTURE_2D, 0);
  78.  
  79.  
  80.  
  81. end;
  82.  
  83. procedure TMultiSampleFBO.Unbind;
  84. var
  85.   I: Integer;
  86. begin
  87.   inherited;
  88.   glPopAttrib;
  89.  
  90.   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
  91.   //Blitting
  92. for I := 0 to high(tex) do
  93.  begin
  94.   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, colorBuffers[i]);
  95.   glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, Container);
  96.   glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, finalFBO);
  97.   glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
  98.  end;
  99.  
  100.  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
  101.  
  102.  glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 );
  103.  glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 );
  104.  
  105. end;
  106.  
  107.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Mo Feb 06, 2012 12:05 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hat hier jemand eine Idee wie das korrekt anzuwenden ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Mo Feb 13, 2012 17:46 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
also ich habs mittlerweile geschafft den MRT FBO zu blitten. Sieht auch TOP aus. Problem ist jetzt nur folgendes.. Irgendwie wird der Depthbuffer nicht richtig geblittet. Aktuell mach ich folgendes:

1. Ich rendere meine Szene (ohne Skybox) in den GBuffer (Multisampled)
2. Dann wird alles in den ZielFBO geblittet (hier kann ich auch auf alle Texturen zugreifen
3. Dann rendere ich aber noch die Skybox und andere geschichten mit dem vorhandenen DepthBuffer (aus ZielFBO)

Nun hab ich an den Aussenkanten (zur Skybox hin) Kanten ohne ende.. Das sagt mir das der Depthbuffer nicht Antialised wurde..
Woran könnte das liegen? Der Depthbuffer durchläuft aufjedenfall das blitten, sonst wäre er ja nicht im ZielFBO..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO + MRT + Antialising
BeitragVerfasst: Mo Feb 13, 2012 19:55 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich weiß ja nicht wie die "Kanten" aussehen, aber wenn man das Bild und auch die Tiefe runterskaliert auf die Zielauflösung wird der Durchschnitt gebildet. Dann entstehen an den Kanten "ins nichts" Bereiche wo die Tiefe nicht ganz 1 ist, und die Farbe enthält Teile von Schwarz (oder der Farbe die da beim letzten Zeichnen war, wenn man sie nicht löscht). Da aber die Tiefe nicht 1 ist (auf der FarClipping-Plane) kann die Skybox da nicht hinschreiben.
Oder hab' ich dein Problem missverstanden? Ich bin mir nämlich nicht so sicher was beim "blitten" alles passiert.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.009s | 15 Queries | GZIP : On ]