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

Aktuelle Zeit: Di Jul 15, 2025 19:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Hi Leute,

ich hatte ja 'ne Thread-Leiche aus dem Beginner-Forum ausgegraben, aber das ausbleiben der Antworten hat mich dann doch dazu bewegt, dass ich hier noch mals das Problem schildere. :oops:

Ich hab das in-die-Textur-rendern-und-diese-dann-benutzen hinbekommen, nur ist es so, dass ich nicht wirklich den Antialiasing-Effekt wahrnehmen kann,
ich hatte es vorher über den Akkumulationspuffer gemacht und dabei schon bei 8fach eine Kantenglättung sehen können, den seh ich, wenn ich das FBO benutze, garnicht =/
(also ich seh die lineare Interpolation bei der Textur dann nicht)

Hier mal die Render-Prozedur:

Code:
  1.       SetStartUpMatrices();
  2.      
  3.       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  4.       glPushAttrib(GL_VIEWPORT_BIT);
  5.       glViewPort(0, 0, FBO_SIZE, FBO_SIZE);
  6.       glClearColor(1,0,0,1);
  7.       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  8.      
  9.       glPushMatrix();
  10.       glRotatef(30,0,0,1);
  11.      
  12.       // hier wird die Szene gerendert
  13.      
  14.       glPopMatrix();
  15.       glPopAttrib();
  16.       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  17.      
  18.       glClearColor(0,0,0,1);
  19.       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  20.      
  21.       glEnable(GL_TEXTURE_2D);
  22.       glBindTexture(GL_TEXTURE_2D, tex); //tex ist die Textur in die mit dem FBO gerendert wird
  23.       glBegin(GL_QUADS);
  24.         glColor3f(1,1,1);
  25.         glTexCoord2f(0,0); glVertex2f(-2,-2);
  26.         glTexCoord2f(0,1); glVertex2f(-2,+2);
  27.         glTexCoord2f(1,1); glVertex2f(+2,+2);
  28.         glTexCoord2f(1,0); glVertex2f(+2,-2);
  29.       glEnd();
  30.       glDisable(GL_TEXTURE_2D);


Hier die Parameter-Setzungen für die FBO-Textur:

Code:
  1.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  2.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);


Aus Spaß an der Freude - nein zum Testen - hab ich einfach mal geguckt ob interpoliert wird wenn FBO/Textur kleiner sind als die Fläche des Quads auf das am Ende die Szene kommt: Ja
Im Anhang sind der Reihenfolge nach von oben nach unten: FBO ohne AA, FBO mit 16xAA, Akkumulationspuffer ohne AA, AKkumulationspuffer mit 8xAA

Im Endeffekt, wenn das FSAA mit dem FBO geht, möchte ich es auf ein MSAA umbasteln (hab da 'ne Idee die ich dann aber erstmal austesten will)

MfG
bubble


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

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also ich verstehe das so das 16x FSAA bei dir heißt das dein FBO entsprechend einfach in jeder Richtung 4-fache Auflösung hat, richtig? Dein Problem ist nun das du die FBO-Textur auf die Originalgröße verkleinern willst. Das geht nur dann, wenn die Textur eine Mipmap hat. Ohne Mipmap pickt die Grafikkarte einfach nur den besten Pixel raus und nimmt diesen ohne ihn mit den Nachbarn zu verrechnen. (Stell dir vor du würdest 16x verkleinern, dann müsste die Grafikkarte 16x16 = 256 Pixel zur Laufzeit zusammenfassen...das wäre viel zu langsam!)

Bei OpenGL 1.4 bis OpenGL 2.x kannst du ein Texturflag setzen damit die Mipmaps immer dann generiert werden, wenn Level 0 der Textur verändert wird:
Code:
  1. glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, true);


Bei OpenGL 3.0 oder neuer kannst/musst du selbst bestimmen wann die Mipmaps erzeugt werden in dem du explizit folgendes Aufrufst während die Textur gebunden ist:
Code:
  1. glGenerateMipmap(GL_TEXTURE_2D);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Seit wann das denn? Sonst war es immer so, dass GL_LINEAR funktioniert hat. War zwar manchmal etwas langsam, ging aber.

greetings

_________________
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: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Seit wann das denn?

Hm, wenn du so fragst....100% sicher bin ich mir nicht. Wenn es aber jetzt mit Mipmaps funktionieren sollte wissen wir es :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Coolcat hat geschrieben:
Also ich verstehe das so das 16x FSAA bei dir heißt das dein FBO entsprechend einfach in jeder Richtung 4-fache Auflösung hat, richtig?

Richtig.

Was die Mipmaps angeht, ich hab mit den Dingern noch nich wirklich was zu tun gehabt, hab das aber so verstanden, dass die eine Art "Level of Detail" von der Textur ist.
Und bei GL_LINEAR hab ich das bei den Textur-Parametern eigentlich auch so verstanden, dass da halt linear interpoliert wird.

Ich hab an sich noch nicht so viel mit "zu großen" Texturen gearbeitet, deshalb weiß ich nicht ob ichs einfach nur falsch verstehe oder ich etwas falsch mache :S

Ansonsten: Man müsste ja eine Interpolation der Farbwerde auch über den Fragment-Shader realisieren können oder? Weil dann kann ich auch noch eine Gewichtung der Farbwerte einbringen...

MfG
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 19:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
thebubble hat geschrieben:
Ansonsten: Man müsste ja eine Interpolation der Farbwerde auch über den Fragment-Shader realisieren können oder? Weil dann kann ich auch noch eine Gewichtung der Farbwerte einbringen...

Ein Fragmentshader, der 16 oder gar 256 Texel ausliest, wird dir aber in der Performance massiv zusammenbrechen. Sonst gäbe es schöne Blur-Effekte für lau ;).

greetings

_________________
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: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 10, 2011 19:19 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Lord Horazont hat geschrieben:
in der Performance massiv zusammenbrechen


Das ist so "anstrengend" die Texel auszulesen?! Weil das ganze was ich später an sich vor hab mit dem FBO-FSAA, ist dass ich als erstes in einem Render die Tiefenpuffer-Daten hab (FBO 1) dann an sich ein FBO 2 hab in dem ich die Szene ohne AA render und in einem dritten FBO wollt ich halt, dass wenn die Tiefendatenunterschiede zu groß werden, ich nur da dann die Szene rendere, allerdings mit FSAA-Größe (so wie oben beschrieben) und dann FBO3 auf FBO2 geblendet als Ausgabe benutze.

Ich dachte, das wäre recht gut/perfomant über Fragment-Shader zu berechnen :oops:
Ich muss allerdings auch dazu sagen, dass ich noch nich wirklich viel mit Shadern gearbetet habe (Vertex-Shader garnicht und Fragment-Shader an sich nur für eine Per-Pixel-Beleuchtung für eine globale Lichtquelle [wo man an sich nur die Normale des Lichtes benutzt])
Ist die ganze überlegung Schwachsinn?

MfG
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Do Mai 12, 2011 16:29 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Wenn man als Texturfilter GL_LINEAR nimmt, funktioniert das nur für 4-fach AA, weil der auch nur die 4 benachbarten Pixel interpoliert. Wenn das bei dir trotzdem nicht ordentlich funktioniert, versuch mal die Texturkoordinaten um einen halben Texel zu verschieben.
Für alles was höher ist als 4-fach brauchst du wohl wirklich Mipmaps. Das Problem ist das bei einem sich veränderten Bild auch immer die Mipmaps neu berechnet werden werden müssen.
Allerdings ist das mit "glGenerateMipmapEXT(GL_TEXTURE_2D)" wahrscheinlich immer noch schneller als das per Shader zu machen. Selbst wenn man nämlich in dem Shader die Bereiche raussortiert die kein AA benötigen musst die diese Pixel auch erstmal bestimmen. Das willst du über die Tiefenwerte machen (was ja auch sinnvoll ist). Aber um an die Tiefe zu kommen musst du wieder eine Textur auslesen und das auch mehrmals damit du auch die benachbarten Werte erhalten kannst. Außerdem steigt die Komplexität des Shaders was das ganze sowieso langsamer macht.
Also denke ich wird das keine Verbesserung zu der Mipmap-Variante bringen wo das ganze Bild berechnet wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Di Mai 17, 2011 10:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
also wenn ich dich jetzt richtig verstanden haben , dann könntest du die framebuffer multisample extension dafür nutzen...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Mi Mai 18, 2011 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
ich hab es jetzt nur mal überflogen aber das klingt nach exakt dem was ich machen wollte ^_^

Ich werd mich damit dann am Wochenende genauer befassen.

MfG
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Mo Mai 23, 2011 16:28 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
in ORCF löse ich das ganze mit einem Shader zum Rendern des FBOs am Ende des Rendervorgangs:

Code:
  1. #version 120
  2.  
  3. #extension GL_EXT_gpu_shader4 : enable
  4.  
  5. uniform sampler2D Texture;
  6. uniform ivec2 ScreenSize;
  7.  
  8. const Samples = 4; // Sollte im Programm änderbar sein, aber benutze auf keinen Fall eine Uniform-Variable
  9.  
  10. void main(void) {
  11.   gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
  12.   for (int i = 0; i < Samples; i++) {
  13.     for (int j = 0; j < Samples; j++)
  14.       gl_FragColor.rgb += texelFetch2D(Texture, Samples * ivec2(floor(gl_FragCoord.xy)) + ivec2(i, j), 0).rgb;
  15.   }
  16.   gl_FragColor.rgb /= (Samples * Samples);
  17.  
  18.   gl_FragColor *= gl_Color;
  19. }


ich hoffe, ich hab jetzt keine wichtigen Codeteile rausgeschmissen, denn der rechnet bei mir noch ne Ecke mehr. Die Textur wird dabei einfach mit GL_NEAREST gefiltert.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Full Sceen Antialiasing via FBO
BeitragVerfasst: Mi Mai 25, 2011 08:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
und was soll das jetzt bringen außer das der FBO massiv an Qualität verliert? Antialiasing jedenfalls nicht.

[edit] hier noch eine weitere Möglichkeit (ratet mal was das besondere daran ist :P )
Code:
  1.  
  2. #1   SUB vec2 t1,pa,pb
  3. #2   DOT float t2,t1,t1
  4. #3   ORT float t2,t2
  5. #4   MUL vec2 t1,t1,t2
  6. #5   ORT vec2 t2,t1
  7. #6   MOV vec2 t3,pa
  8. //schleife start
  9. #7   ADD vec2 t4,t3,t2
  10. #8   ADD scr t4,t3,t4
  11. #9   SUB vec2 t4,t3,t2
  12. #10  ADD scr t4,t3,t4
  13. #11  MUL scr t4,t4,0.333
  14. #12  ADD vec2 t3,t3,t1
  15. #13  CMP t3,pb
  16. #14  JEQ 7
  17. //schleife ende
  18.  

_________________
Meine Homepage


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


Wer ist online?

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