Qt/QML/OpenGL:在QML下,使用OpenGL时半透明项的Z-ordering无法正常工作。

3

我一直在跟随此处找到的示例,并且遇到了这样的问题:无论QML中的顺序如何或设置z属性如何,半透明项总是绘制在不透明项之上。

如果没有OpenGL项,则一切都按预期工作。

import QtQuick 2.14
import TestScene 1.0

Item {
    width: 160
    height: 120

    /*
    TestScene {
        // draw checkered pattern in OpenGL
    }
    */

    Rectangle {
        id: rect1

        x: 32
        y: 32
        width: 32
        height: 32

        color: Qt.rgba(1, 0, 0, 0.5)
    }

    Rectangle {
        id: rect2

        x: 32+16
        y: 32+16
        width: 32
        height: 32

        color: Qt.rgba(0, 0, 1, 1)
    }
}

期望的结果

当取消注释TestScene项目时

结果

即使在设置rect1之前设置rect2,无论任何项目的z属性如何,这种情况都会发生。

C ++中的OpenGL代码几乎与Squircle示例相同,并且在Windows 10和Qt 5.14上运行。

只是好奇为什么会发生这种情况,是否可以防止或者这只是在QML下绘制OpenGL的限制。

1个回答

2
请看QOpenGLFrameBuffer。
它允许对基于OpenGL的项目在QML场景图中进行精细的控制,与您正在使用的技术相比,我认为它允许在渲染QML场景图项目之前或之后渲染自定义的OpenGL项目。
示例项目位于: qt\Examples\$QTVERSION\quick\scenegraph\textureinsgnode

我尝试了解这个问题,但没有找到有关在QQuickItem中使用QOpenGLFramebufferObject的任何信息,而且我的qt示例目录(Qt5.14.1\Examples\Qt-5.14.1\quick\scenegraph)中没有“textureinsgnode”示例。 然而,我发现了这篇博客文章,它介绍了QQuickFramebufferObject,似乎是“在QML下使用OpenGL”的示例的替代品。感谢您指引我走向不同的方向,否则我可能找不到这篇文章。 - user2518251
这是一个示例项目的链接:https://code.qt.io/cgit/qt/qtdeclarative.git/tree/examples/quick/scenegraph/textureinsgnode?h=5.13 - Pat Honeycutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接