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

Reply via email to