使用QOpenGLFrameBufferObject类实现Qt5的OpenGL多重采样技术

4

我需要在一个Qt5项目中执行多重采样,但我不确定如何使用QOpenGLFrameBufferObject来执行FSAA。据我所搜寻,没有关于如何做到这一点的示例,并且文档只提到:“如果您想使用启用了多重采样的帧缓冲对象作为纹理,则需要首先使用QOpenGLContext::blitFramebuffer()将其从帧缓冲对象复制到普通帧缓冲对象。”我的代码目前看起来像这样:

//Enable FSAA for better output
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
if(m_lpFBO == NULL)
{
    //MultiSampling set to 4 now
    QOpenGLFramebufferObjectFormat format;
    format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
    format.setMipmap(true);
    format.setSamples(4);
    format.setTextureTarget(GL_TEXTURE_2D);
    format.setInternalTextureFormat(GL_RGBA32F_ARB);

    //Create the FBO
    m_lpFBO = new QOpenGLFramebufferObject(vp[2], vp[3], format);
    m_lpFBOSurface = new QGLFramebufferObjectSurface(m_lpFBO);
}

QRect rc(0, 0, vp[2], vp[3]);
QGLSubsurface sub(lpPainter->currentSurface(), rc);


m_lpFBO->bind();
sub.setFramebufferObject(m_lpFBO);
lpPainter->pushSurface(&sub);

//Draw as usual
.
. 
.

lpPainter->popSurface();


//Now Copy
QOpenGLFramebufferObject::blitFramebuffer(lpPainter->currentSurface()->framebufferObject(), rc, m_lpFBO, rc);

嗨,这个解决方案有效吗? - sp497
1个回答

6
您不需要使用 QGLFramebufferObjectSurface 来执行必要的下采样操作,因为您可以使用两个 QGLFramebufferObjectQOpenGLFramebufferObject::blitFramebuffer(调用 glBlitFramebuffer)将自动管理从源帧缓冲目标到目标帧缓冲目标的下采样(或上采样)。使用 (GL_NEARESTGL_LINEAR) 可以指定转换如何计算以及要传输的附件 (GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT 的按位组合)。
因此,根据您的需求,您需要创建 2 个 QOpenGLFramebufferObject,其中一个包含正在渲染的多样本纹理,另一个包含下采样结果纹理。接下来,您将使用 QOpenGLFramebufferObject::blitFramebuffer 将源纹理下采样到结果纹理中。
这是一个快速示例:
// MultiSampling set to 4 now
QOpenGLFramebufferObjectFormat muliSampleFormat;
muliSampleFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
muliSampleFormat.setMipmap(true);
muliSampleFormat.setSamples(4);
muliSampleFormat.setTextureTarget(GL_TEXTURE_2D);
muliSampleFormat.setInternalTextureFormat(GL_RGBA32F_ARB);
QOpenGLFramebufferObject multiSampledFBO(width, height, format);

QOpenGLFramebufferObjectFormat downSampledFormat;
downSampledFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
downSampledFormat.setMipmap(true);
downSampledFormat.setTextureTarget(GL_TEXTURE_2D);
downSampledFormat.setInternalTextureFormat(GL_RGBA32F_ARB);
QOpenGLFramebufferObject downSampledFBO(width, height, downSampledFormat);

然后,每次需要下采样(在渲染到多重采样纹理之后),只需执行以下操作即可(使用您喜欢的过滤器)。
QOpenGLFramebufferObject::blitFramebuffer(
    &downSampledFBO, &multiSampledFBO,
    GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接