Qt3D - 如何不绘制网格物体?

时间:2017-12-06 14:19:06

标签: c++ qt qml qt3d

我不想在场景中绘制一些物体。在普通的OpenGL中,我们只是不要调用与绘制网格相关的函数。

不幸的是,我没有在QML中找到这个“功能”。实体不包含“可见性”属性等。当然,我们可以尝试将制服发送到着色器,并在需要时丢弃渲染 - 它会起作用,但这种方法看起来不太好。

可以通过使用QML来实现,还是应该在cpp文件中创建完整的渲染功能?

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。

最简单的解决方案是从您的实体中删除材料。 你会有这样的事情:

Entity {
    property bool visible: true // or ideally, dynamically read from a c++ property or whatever suits you

    Material {
        id: myMaterial
        // stuff
    } 

    GeometryRenderer {
        id: myRenderer
        // stuff
    }

    components: visible ? [myMaterial, myRenderer] : []
}

另一种解决方案(可能有点困难)是在材质中使用的效果中使用滤镜。 Effect组件将具有一个或多个RenderPasses。每个渲染过程都可以有过滤键:

RenderPass {
    id: myPass

    filterKeys: [ FilterKey { name: "PassType"; value: "customFilterIdString" } ] // <-- This line here

    renderStates: [
        BlendEquationArguments {
            ...
        }, 
     ...
    ]
}

可以使用RenderPassFilter组件在RenderTree中过滤每个渲染过程。这允许您跳过整个对象集并按顺序完成传递。这有点高级,如果您只想隐藏特定对象,我认为您不需要它,但不要犹豫,阅读文档并使用这些组件查找示例

答案 1 :(得分:1)

最简单的方法是将实体的enabled property设置为false。

对于更精细和更多功能的控制,您可以查看使用QLayer组件。