2014-03-06 13 views
5

Im Büro arbeiten wir mit einer alten GLX/Motif-Software, die OpenGL AccumulationBuffer verwendet, um Anti-Aliasing zum Speichern von Bildern zu implementieren. Unser Problem ist, dass Apple den AccumulationBuffer von allen seinen Treibern entfernt hat (ab OS X 10.7.5), und einige Linux-Treiber wie Intel HDxxxx unterstützen es auch nicht.OpenGL SuperSampling Anti-Aliasing?

Dann möchte ich den Anti-Aliasing-Code der Software aktualisieren, damit er mit den meisten tatsächlichen Betriebssystemen und GPUs kompatibel ist, aber die erzeugten Bilder so schön wie zuvor (weil wir sie für wissenschaftliche Publikationen benötigen).

SuperSampling scheint die älteste und beste Anti-Aliasing-Methode zu sein, aber ich kann kein Beispiel für SSAA finden, die AccumulationBuffer nicht verwendet. Gibt es eine andere Möglichkeit, SuperSampling mit OpenGL/GLX zu implementieren?

+0

Auf welche Version von GL zielen Sie? Der Akkumulationspuffer ist in GL 3.0 veraltet und wurde in 3.1 (ohne 'GL_ARB_compatibility')/3.2+ * Core * entfernt. Deshalb finden Sie sie nicht auf OS X oder Intels Treibern. Haben Sie anstelle des Akkumulationspuffers in Betracht gezogen, in einen FBO mit einem ganzzahligen Vielfachen der Abmessungen Ihres Standard-Framebuffers zu zeichnen und das Downsampling später mit einem einfachen 'GL_LINEAR'-Filter durchzuführen? –

+0

Hallo Andon, danke für die Antwort. – Fravadona

+0

Ich denke über jede Methode nach, die gute Szenen-Anti-Aliasing (zum Speichern von Bildern) in einer kompatiblen Weise mit alten und modernen OpenGL-Implementierungen durchführen kann. Jetzt werde ich nach einem "GLX FBO GL_LINEAR Downsampling" Beispiel im Internet suchen. – Fravadona

Antwort

3

Sie können FBOs verwenden, um die gleiche Art von Anti-Aliasing zu implementieren, die Sie wahrscheinlich mit Akkumulationspuffern verwendet haben. Der Prozess ist fast der gleiche, außer dass Sie einen Textur/Renderpuffer als "Akkumulationspuffer" verwenden. Sie können entweder zwei FBOs für den Prozess verwenden oder das angehängte Renderziel eines einzelnen Render-FBO ändern.

In Pseudo-Code, mit zwei FBOs, sieht die Strömung in etwa wie folgt aus:

create renderbuffer rbA 
create fboA (will be used for accumulation) 
bind fboA 
attach rbA to fboA 
clear 

create texture texB 
create fboB (will be used for rendering) 
attach texB to fboB 
(create and attach a renderbuffer for the depth buffer) 

loop over jitter offsets 
    bind fboB 
    clear 
    render scene, with jitter offset applied 

    bind fboA 
    bind texB for texturing 
    set blend function GL_CONSTANT_ALPHA, GL_ONE 
    set blend color 0.0, 0.0, 0.0, 1.0/#passes 
    enable blending 
    render screen size quad with simple texture sampling shader 
    disable blending 
end loop 

bind fboA as read_framebuffer 
bind default framebuffer as draw framebuffer 
blit framebuffer 

Vollsupersampling ist ebenfalls möglich. Wie Andon im obigen Kommentar vorgeschlagen hat, erstellen Sie einen FBO mit einem Renderziel, das ein Vielfaches Ihrer Fenstergröße in jeder Dimension ist, und führen am Ende eine Abwärtsskalierung Ihres Fensters durch. Das Ganze neigt dazu, langsam zu sein und eine Menge Speicher zu verwenden, sogar mit einem Faktor von 2.