Using QML Items as texture for custom QSGGeometry QML QQuickItem

  • Hi,

    I am looking to use a QML item and use its content to render onto a non-regular polygon created with a QQuickItem which creates its own QSGGeometry and texture coordinates.

    1. So far, I can create the geometry and texture coordinates in a custom QQuickItem which can be instantiated in QML. (Although it crashes on draw because no texture is set on the QSGTextureMaterial).

    2. I can also use a ShaderEffectSource in QML to grab a QML Item tree as a texture.

    What I need to be able to do is to push the grabbed texture onto the custom QQuickItem geometry and hide the original Item tree in order to see a visual "warped" version of the original Item tree.

    I tried using the QML Item layer to push the texture onto, but this only results in the texture showing in a rectangle form using basic boundary rect according to the target Item. What I want to do is to have the texture respect the custom geometry and texture coordinates (linking the two bits from 1 and 2 above).

    Has anyone succeeded in doing this?



  • It's a little bit simpler but very similar, "here":

  • Hi belab,
    Thanks for the suggestion however I really need to do is to get the image of a rendered QML Item (and its subtree) e.g. using a ShaderEffectSource and then using that image as a texture to use on another QQuickItem derived class which has custom geometry.
    As I said, I can grab the texture and I have the custom item. I just can't create the texture in that custom item yet because I don't know how to assign it from the ShaderEffectSource from QML.
    Any suggestions appreciated.

  • shaderEffectSource->textureProvider()->texture() called in QQuickItem::updatePaintNode will extract the QSGTexture* for you assuming that shaderEffectSource is of qml type ShaderEffectSource. pity there is no c++-only api for doing this

  • Thanks lemourin,

    Eventually I got it working a while back, but it was not a nice experience writing lots of nasty c++ to get around the lack of public API for doing this and has been captured by the following bug.

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.