2014-03-06 124 views
5

在办公室,我们正在使用一个旧的GLX/Motif软件,该软件使用OpenGL的AccumulationBuffer来实现保存图像的抗锯齿功能。 我们的问题是Apple从所有的驱动程序中删除了AccumulationBuffer(从OS X 10.7.5开始),而一些像Intel HDxxxx这样的Linux驱动程序也不支持它。OpenGL超采样反锯齿?

然后,我想更新软件的抗锯齿代码,以使其与大多数实际操作系统和GPU兼容,但保持生成的图像像以前一样美丽(因为我们需要它们用于科学出版物)。

SuperSampling似乎是最古老和质量最好的抗锯齿方法,但我找不到任何不使用AccumulationBuffer的SSAA示例。用OpenGL/GLX实现超采样有什么不同吗?

+0

您定位的GL版本是什么?累积缓冲区在GL 3.0中已弃用,并在3.1(不含'GL_ARB_compatibility')/ 3.2+ * Core *中删除。这就是为什么你不能在OS X或Intel的驱动程序上找到它们的原因。代替累积缓冲区,您是否考虑过将您的默认帧缓冲区的尺寸的整数倍乘以FBO,然后使用简单的'GL_LINEAR'过滤器进行下采样? –

+0

嗨安东,谢谢你的回复。 – Fravadona

+0

我正在考虑采用与古代现代OpenGL实现相兼容的方式,实现高质量场景消除锯齿(用于保存图像)的任何方法。 现在,我将在互联网上寻找任何“GLX FBO GL_LINEAR缩减采样”示例。 – Fravadona

回答

3

您可以使用FBO来实现您最有可能与累积缓冲区一起使用的相同类型的抗锯齿功能。除了使用纹理/渲染缓冲区作为“累积缓冲区”之外,该过程几乎相同。您可以为流程使用两个FBO,也可以更改单个渲染FBO的附加渲染目标。

在伪代码,使用两个宗教组织,流程看起来大致是这样的:

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 

完全超级采样也是可能的。正如上面评论中的Andon所建议的那样,您可以创建一个FBO,其渲染目标是每个维度中窗口大小的倍数,最后在窗口中执行缩小比例。整个事情往往是缓慢的,并使用大量的内存,即使只有2倍。