簡體   English   中英

使用QOpenGLFrameBufferObject類的Qt5 OpenGL多重采樣

[英]Qt5 OpenGL Multisampling using QOpenGLFrameBufferObject class

我需要在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);

您不需要使用QGLFramebufferObjectSurface來執行必要的下采樣,因為您可以只使用兩個QGLFramebufferObject QOpenGLFramebufferObject::blitFramebuffer (調用glBlitFramebuffer )將自動管理從源幀緩沖區目標到目標幀緩沖區目標的下采樣(或上采樣)。 blitFramebuffer還允許您指示如何使用( GL_NEARESTGL_LINEAR )計算轉換以及要傳輸的附件( GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITGL_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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM