Окно QML в текстуру Unity с использованием Spout2 SDK - PullRequest
0 голосов
/ 18 октября 2019

В настоящее время я застрял при перемещении контента из QML в Unity. Моя идея заключалась в использовании системы обмена видеокадрами Spout. Часть Unity работает и работает, но получает только недопустимые текстуры.

Для части Qt / QML мне нужно использовать компилятор MinGW, так что я могу использовать только собственные C Spout .dll (которые должны работать нормально, так как Unity обнаруживает отправителя Spout)

Для части QML:

Item {
    id:root
    width: 500
    height: 500

    TextureCapturing{ //This is my own element, which provides the Spout sender
        id: capturing
    }

    ShaderEffectSource { //This is used as the source item 
        id: textureSource
        sourceItem: test
        hideSource: false
        width: sourceItem ? sourceItem.width : 0
        height: sourceItem ? sourceItem.height : 0
    }

    Timer{ //This prevents code executing until the window is fully build up
        interval: 500
        running: true
        repeat: false
        onTriggered: capturing.source = textureSource;
    }

    Rectangle{ //Some test content 
        id:test
        property bool isClicked: false
        anchors.fill: parent
        color: isClicked ? "red" : "blue"
        MouseArea{
            anchors.fill: parent
            onClicked: parent.isClicked ^= true
        }
    }

Компонент TextureCapturing - это пользовательский класс, который я добавил. Следующий код работает, не выдает ошибок, но, к сожалению, и результатов тоже нет:

TextureCapturing::TextureCapturing() : QObject()
{
    spoutptr = GetSpout(); // Create an instance of the Spout library
    spoutptr->SetDX9(false);
}

TextureCapturing::~TextureCapturing()
{
    if(spoutptr) {
        qDebug()<< "Releasing Spout";
        spoutptr->ReleaseSender(); // Release the sender
        spoutptr->Release(); // Release the Spout library instance
    }
}

void TextureCapturing::setSource(QQuickItem *source)
{

    if(source != m_source){
        m_source = source;
        newWindow = m_source ? m_source->window() : nullptr;
        connect(newWindow, &QQuickWindow::afterRendering,
                this, &TextureCapturing::update, Qt::DirectConnection);
    }
}

QQuickItem *TextureCapturing::source() const
{
    return m_source;
}

void TextureCapturing::update()
{
    if(!senderExists){
        senderExists = spoutptr->CreateSender("QMLSender", 500, 500);
        QOpenGLFramebufferObjectFormat format;
        format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
        format.setMipmap(false);
        format.setSamples(0);
        format.setTextureTarget(GL_TEXTURE_2D);
        format.setInternalTextureFormat(GL_RGBA8);
        fbo = new QOpenGLFramebufferObject(500,500,format);
        newWindow->setRenderTarget(fbo);
    }

    qDebug()<< "TextureId: " << fbo->texture();
    glBindTexture(GL_TEXTURE_2D, fbo->texture());
    spoutptr->SendTexture(fbo->texture(), GL_TEXTURE_2D, 500, 500);
    glBindTexture(GL_TEXTURE_2D, 0);
    qDebug()<< "Send";
}

Я уверен, что что-то не так в привязке fbo и отправке текстуры. Проблема в том, что я никогда не работал с OpenGL и пробовал разные подходы только без каких-либо изменений в результатах ...

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...