Frank, This is based on the Qt rendercontrol example which is precisely what I am using now and so far the best option. Thanks for sharing!
I’m now trying another option based on the xorblender example where a quickItem texture provider can be access from C++ side if the quick item has the layer property set to enable. And while I can access the texture, it only seems to show the content of that particular layer without any of its children being displayed, which is a bummer. I don’t know what I’m missing… :( Best, Nuno > On 8 Jul 2021, at 01:17, Frank Mertens <fr...@cyblogic.de> wrote: > > Hi Nuno, > > another link doing magic with FBO and offscreen rendering, from which I > learned a lot: > github.com/machinekoder/qml-oled-renderer > > God speed, > Frank > On 07.07.21 08:13, Nuno Santos wrote: >> Frank, >> >> Thanks for your reply. >> >> I’ve been on your StackOverflow question before! :) Several times actually! >> >> In the mean time I have found the answer for my question. The trick is to >> use QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts) before >> starting QGuiApplication. >> >> Then, when initialising the QOpenGLContext that will be used offscreen >> renderer, we need to set >> _context->setShareContext(QOpenGLContext::globalShareContext()); This way, >> the texture is know to both renderers. >> >> While it is working pretty good on Mac, on Windows I’m having flickering. My >> theory is that the texture is being updated while it is being painted. I >> might need to find the right time to render the offscreen surface. Maybe >> before “beforeRendering” of the main window so that when it paints, the >> texture is available. If someone has a solution for this please let me know. >> >> I’ve also tried another suggestion which is use ShaderEffectSource with the >> item I want to capture as source, take it to the C++ level and access to the >> textureProvider()->texture() at the afterRendering signal of the main >> window. I was not successful with this technic. All I could see was black or >> rubbish. This technic would spare me a separate render engine though. >> >> I know this is not a feature that every single Qt app developer will require >> but having official hook for this kind of things would be great. >> >> I’m using the single threaded version of the rendercontrol example. Since >> it's being instantiated and driven by the main thread, it stresses the >> process main cpu usage a bit. I will eventually give a try to the multi >> threaded version to see if it has more benefits than problems. >> >> Best regards, >> >> Nuno >> >>> On 7 Jul 2021, at 02:36, Frank Mertens <fr...@cyblogic.de >>> <mailto:fr...@cyblogic.de>> wrote: >>> >>> Hey Nuno, >>> >>> done a lot of QQuickRenderControl tricks lately. But I'm using it on >>> QSGRendererInterface::Software. >>> I'm not sure if it helps, but check out: >>> https://stackoverflow.com/questions/17146747/capture-qml-drawing-buffer-without-displaying/67187802#67187802 >>> >>> <https://stackoverflow.com/questions/17146747/capture-qml-drawing-buffer-without-displaying/67187802#67187802> >>> >>> God speed, >>> Frank >>> >>> On 29.06.21 17:27, Nuno Santos wrote: >>>> Hi, >>>> >>>> I’m trying to make a offscreen renderer for a quick scene and then display >>>> it’s output in the main and visible QQuickWindow scene. >>>> >>>> The reason I’m trying to achieve this is because I need to intercept the >>>> frames to be able to send them to other programs or encode as a video file. >>>> >>>> I’ve based myself on the rendercontrol example and I have a working >>>> offscreen renderer. Now, what I’m trying to do is to paint the result of >>>> the offscreen renderer into the main QQuickWindow. >>>> >>>> What I’m doing is creating a new QQuickItem that paints a texture. When I >>>> declare this item in qml, I register it on the render control. Render >>>> control has it’s own render timing. Whenever render control paints, I tell >>>> the registered quick item to paint with the fbo texture. >>>> >>>> The problem is that the only thing that is painted is black. I’m pretty >>>> sure the quick item is paint texture correctly because it works with >>>> images: >>>> >>>> // render method >>>> >>>> … >>>> >>>> if (_renderView) >>>> { >>>> _renderView->setImage(_fbo->toImage()); // this works >>>> >>>> _renderView->setTexture(_quickWindow->createTextureFromId(_fbo->texture(), >>>> _size)); // this doesn’t work - only black is painted >>>> } >>>> >>>> … >>>> >>>> I wonder if I’m stumbling on synchronisation issues. Maybe when its time >>>> for the main window to paint again, that texture is not valid anymore. >>>> >>>> Performance is a key factor in this architecture. I need the fastest >>>> solution possible and it doesn’t seem that creating a QImage from a >>>> texture and then convert it to QSGTexture is the most performant solution >>>> possible. >>>> >>>> Has anyone been here before? >>>> >>>> Any advise on how to overcome this problem? >>>> >>>> Thanks! >>>> >>>> Best regards, >>>> >>>> Nuno >>>> >>>> >>>> _______________________________________________ >>>> Interest mailing list >>>> Interest@qt-project.org <mailto:Interest@qt-project.org> >>>> https://lists.qt-project.org/listinfo/interest >>>> <https://lists.qt-project.org/listinfo/interest> >>> >>> _______________________________________________ >>> Interest mailing list >>> Interest@qt-project.org <mailto:Interest@qt-project.org> >>> https://lists.qt-project.org/listinfo/interest >>> <https://lists.qt-project.org/listinfo/interest> >> >
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest