![](/img/trans.png)
[英]OpenGL depth buffer using QOpenGLFramebufferObject not working
[英]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_NEAREST
或GL_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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.