В настоящее время я застрял при перемещении контента из 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 и пробовал разные подходы только без каких-либо изменений в результатах ...
Заранее спасибо!