2014-10-04 145 views
3

我创建了一个新的QML项目,并使用自定义的QML项目来集成原始的OpenGL。QQuickFramebufferObject在QML中翻转Y轴

如果我在QQuickFramebufferObject :: Renderer中使用framebufferObject()->toImage().save("a.png"); 截图,那么表面是正确的渲染器,但QML表面在Y轴上翻转。

为了解决这个问题,我需要在Y轴上缩放我的矩阵-1,但是现在我的屏幕截图被翻转了。我认为翻转来自QML与OpenGL坐标。有人可以给我一个QML来正确呈现而不是缩放我的矩阵吗?

回答

1

只是重写功能QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *, UpdatePaintNodeData *)

QSGNode* QVTKFrameBufferObjectItem::updatePaintNode(
    QSGNode *const inOutNode, UpdatePaintNodeData *const inOutData) { 
    const int width = this->width(); 
    const int height = this->height(); 
    QMatrix4x4 flipY; 
    flipY.translate(width*0.5, height*0.5); 
    flipY.scale(1.0, -1.0); 
    flipY.translate(-width*0.5, -height*0.5); 
    inOutData->transformNode->setMatrix(flipY); 
    return QQuickFramebufferObject::updatePaintNode(inOutNode, inOutData); 
} 
+0

此解决方案覆盖可通过QML分配给该项目的转换。除了垂直镜像将应用于所有子项目(如果有的话)。但是,这个答案帮助我得出了[**正确的解决方案**](http://stackoverflow.com/a/39082403/6394138)。 – Leon 2016-08-22 14:42:36

1

在您的自定义项(这当然是一个子类的QQuickFramebufferObject)覆盖updatePaintNode()方法如下:

QSGNode* updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData* upnData) 
{ 
    QSGNode* node = QQuickFramebufferObject::updatePaintNode(oldNode, upnData); 
    QSGSimpleTextureNode& textureNode = dynamic_cast<QSGSimpleTextureNode&>(*node); 
    textureNode.setTextureCoordinatesTransform(QSGSimpleTextureNode::MirrorVertically); 
    return node; 
}