4

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

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

SuperSampling 似乎是最古老、质量最好的抗锯齿方法,但我找不到任何不使用 AccumulationBuffer 的 SSAA 示例。有没有不同的方法来使用 OpenGL/GLX 实现 SuperSampling ???

4

1 回答 1

3

您可以使用 FBO 来实现最有可能用于累积缓冲区的相同类型的抗锯齿。该过程几乎相同,只是您使用纹理/渲染缓冲区作为“累积缓冲区”。您可以为该过程使用两个 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,其渲染目标是每个维度中窗口大小的倍数,最后对窗口进行缩小 blit。整个事情往往很慢并且使用大量内存,即使只有 2 倍。

于 2014-05-17T05:39:05.353 回答