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);
4

1 に答える 1

6

QGLFramebufferObjectSurface2つのを使用できるため、必要なダウンサンプリングを実行するためにを使用する必要はありませんQGLFramebufferObjectQOpenGLFramebufferObject::blitFramebuffer(を呼び出すglBlitFramebuffer)は、ソースフレームバッファターゲットからデスティネーションフレームバッファターゲットへのダウンサンプリング(またはアップサンプリング)を自動的に管理します。また、(または)blitFramebufferを使用して変換を計算する方法と、転送する添付ファイル(、、、のビット単位の組み合わせ)を指定することもできます。GL_NEARESTGL_LINEARGL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITGL_STENCIL_BUFFER_BIT

したがって、ニーズに応じてQOpenGLFramebufferObject、レンダリング先のマルチサンプリングされたテクスチャを含む2つと、ダウンサンプリングされた結果テクスチャを含む2つのを作成する必要があります。次に、を使用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);
于 2013-03-05T06:20:50.323 に答える