[Interest] Qt3D Rendering offscreen

Andy asmaloney at gmail.com
Wed Aug 16 13:36:27 CEST 2017


On Wed, Aug 16, 2017 at 1:57 AM, Laszlo Agocs <laszlo.agocs at qt.io> wrote:

> The formats look a bit strange. Try rather Texture.RGBA8_UNorm and
> Texture.DepthFormat (or maybe Texture.D24) for color and depth,
> respectively.
>

Thanks Laszlo!

I was trying to follow along with the deferred-renderer-cpp manual test, so
that's where the formats came from (GBuffer).


>
> The node hierarchy looks somewhat incorrect as well. (where’s the
> Viewport/Camera/Clear for the custom render target? What is the FilterKey
> for? (are there multiple renderpasses?) etc.)
>

Right now I am just trying to get a simple forward render to offscreen
working. Basically take the Qt3DWindow and make a version for offscreen. So
the FilterKey comes from the QForwardRenderer.

I thought what I needed to do was set up the viewport/camera/clear on the
forward renderer and just change its target to the offscreen textures
using QRenderTargetSelector.
I didn't realize I needed yet another viewport and camera somewhere?

There is some QML-based example code in https://github.com/alpqr/q3dpostproc
> showing rendering into textures (in multiple passes even) and then
> compositing these on-screen, which may provide some inspiration.
>

Thanks! More examples are useful. The documentation is still very...
sparse... and I've spent a lot of time spelunking the source. It's
difficult to know where nodes are supposed to attach since it's not
generally in the documentation.

Prototyping the framegraph with QML is usually a good idea even when the
> final target is constructing it from C++ since the latter can quickly
> become hard to follow, esp. when getting started.
>

The problem is - while I've been using Qt since 2000 - I've never used QML
:-) I'll take a look.


>
> Best regards,
>
> Laszlo
>
>
>
>
>
> *From:* Interest [mailto:interest-bounces+laszlo.agocs=qt.io at qt-project.
> org] *On Behalf Of *Andy
> *Sent:* onsdag 16. august 2017 07.19
> *To:* Sean Harmer <sean.harmer at kdab.com>
> *Cc:* Qt Project <interest at qt-project.org>
> *Subject:* Re: [Interest] Qt3D Rendering offscreen
>
>
>
> Does anybody have any hints? I've tried all kinds of node configurations
> and can't get this to work.
>
> Thanks.
>
>
> ---
> Andy Maloney  //  https://asmaloney.com
>
> twitter ~ @asmaloney <https://twitter.com/asmaloney>
>
>
>
>
>
> On Sat, Aug 12, 2017 at 2:03 PM, Andy <asmaloney at gmail.com> wrote:
>
> Based on your outline, here is the hierarchy I have set up (but I still
> get images of size (1,1)):
>
> Qt3DRender::QRenderCapture::
>     Qt3DExtras::QForwardRenderer::
>         Qt3DRender::QRenderSurfaceSelector::
>             Qt3DRender::QViewport::
>                 Qt3DRender::QCameraSelector::
>                     Qt3DRender::QClearBuffers::
>                         Qt3DRender::QFrustumCulling::
>         Qt3DRender::QFilterKey::
>         Qt3DRender::QRenderTargetSelector::
>             Qt3DRender::QRenderTarget::
>                 Qt3DRender::QRenderTargetOutput::
>                     Qt3DRender::QTexture2D::
>                 Qt3DRender::QRenderTargetOutput::
>                     Qt3DRender::QTexture2D::
>
> Am I attaching things in the right place?
>
> This is how I'm creating it:
>
>    const QSize cTargetSize( 1024, 768 );
>
>    m_forwardRenderer->setExternalRenderTargetSize( cTargetSize );
>
>    Qt3DRender::QTexture2D  *color0Texture = new Qt3DRender::QTexture2D;
>    color0Texture->setSize( cTargetSize.width(), cTargetSize.height() );
>    color0Texture->setFormat( Qt3DRender::QAbstractTexture::RGBA32F );
>    color0Texture->setGenerateMipMaps( false) ;
>
>    Qt3DRender::QTexture2D  *depthTexture = new Qt3DRender::QTexture2D;
>    depthTexture->setSize( cTargetSize.width(), cTargetSize.height() );
>    depthTexture->setFormat( Qt3DRender::QAbstractTexture::D32F );
>    depthTexture->setGenerateMipMaps( false );
>
>    Qt3DRender::QRenderTargetOutput  *colorOutput = new Qt3DRender::
> QRenderTargetOutput;
>    colorOutput->setTexture( color0Texture );
>    colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0
> );
>
>    Qt3DRender::QRenderTargetOutput  *depthOutput = new Qt3DRender::
> QRenderTargetOutput;
>    depthOutput->setTexture( depthTexture );
>    depthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth
> );
>
>    Qt3DRender::QRenderTarget  *renderTarget = new
> Qt3DRender::QRenderTarget;
>    renderTarget->addOutput( colorOutput );
>    renderTarget->addOutput( depthOutput );
>
>    Qt3DRender::QRenderTargetSelector   *renderTargetSelector = new
> Qt3DRender::QRenderTargetSelector( m_forwardRenderer );
>
>    renderTargetSelector->setTarget( renderTarget );
>
>    m_forwardRenderer->setParent( mRenderCapturer );
>    m_renderSettings->setActiveFrameGraph( mRenderCapturer );
>
>
> ---
> Andy Maloney  //  https://asmaloney.com
>
> twitter ~ @asmaloney <https://twitter.com/asmaloney>
>
>
>
>
>
> On Sat, Aug 12, 2017 at 8:58 AM, Andy <asmaloney at gmail.com> wrote:
>
> On Sat, Aug 12, 2017 at 8:40 AM, Sean Harmer <sean.harmer at kdab.com> wrote:
>
> Hi,
>
> On Friday 11 August 2017 14:34:34 Andy wrote:
> > Goal: With Qt3D (C++), render my scene offscreen, use render capture on
> it,
> > and save image to disk.
> >
> > With my Qt3DWindow-based solution the scene looks fine and I can do the
> > render capture part (on macOS anyways - Windows doesn't work for me -
> > https://bugreports.qt.io/browse/QTBUG-61223 ).
> >
> > Now I need to be able to do it offscreen (without the window open).
> >
> > I thought this was going to be as simple as setting a QOffscreenSurface
> as
> > my forward renderer surface - something like:
> >
> >    QOffscreenSurface *surface = new QOffscreenSurface;
> >
> >    surface->create();
> >
> >    Qt3DExtras::QForwardRenderer  *forwardRenderer = new
> > Qt3DExtras::QForwardRenderer;
> >
> >    forwardRenderer->setSurface( surface );
> >    forwardRenderer->setExternalRenderTargetSize( QSize( 800, 600 ) );
> >
> >    qDebug() << surface->format() << surface->size() <<
> surface->isValid();
> >
> > While this gives me a valid surface and the format is correct, its size
> is
> > always (1,1) and the render capture gives me images of that size.
> >
> > How do I set the size of the QOffscreenSurface?
>
> You don't :) An offscreen surface is only good for making a GL context
> current. It is not suitable as a render target. If you want to do offscreen
>
>
>
> I guess I find that class name confusing then... One draws on a surface,
> right? :-)
>
>
>
> rendering with QOffscreenSurface, you will need to provide your own render
> target in the form of a framebuffer object.
>
> You will need to create an FBO by way of a QRenderTarget with a 2D texture
> of
> the desired size attached to the color0 attachment point, and a depth
> format
> texture of the same size attached to the depth attachment point.
>
>
>
> So that's a QTexture2D for colo0 and... what for the "depth format
> texture"? Another QTexture2D?
>
>
>
>
> Select this with a QRenderTargetSelector in a custom framegraph to direct
> rendering into the attached textures. You can then do a pixel read back
> operation with the QRenderCapure and save the resulting image.
>
>
>
> You make it sound so easy!
>
>
>
>
> I suppose this could be wrapped in a convenience that allows the rest of
> the
> framegraph beyond the render target selector and render capture to be set.
>
>
>
> +1. If I ever get anything working, I'd be happy to work with someone to
> get it into shape for Qt3DExtras.
>
>
>
> Thanks Sean!
>
>
>
>
> Cheers,
>
> Sean
>
> >
> > Or am I going about this the wrong way?
> >
> > (It would be nice to have a class like the Qt3DWindow one specifically
> for
> > offscreen rendering.)
> >
> > ---
> > Andy Maloney  //  https://asmaloney.com
> > twitter ~ @asmaloney <https://twitter.com/asmaloney>
>
> --
> Dr Sean Harmer | sean.harmer at kdab.com | Managing Director UK
> Klarälvdalens Datakonsult AB, a KDAB Group company
> Tel. UK +44 (0)1625 809908, Sweden (HQ) +46-563-540090
> KDAB - Qt Experts - Platform-independent software solutions
>
>
> ---
> Andy Maloney  //  https://asmaloney.com
>
> twitter ~ @asmaloney <https://twitter.com/asmaloney>
>
>
>
>
>

---
Andy Maloney  //  https://asmaloney.com
twitter ~ @asmaloney <https://twitter.com/asmaloney>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20170816/1521bf78/attachment.html>


More information about the Interest mailing list