Qt3D-如何不绘制网格?

use*_*905 5 c++ qt qml qt3d

我不想在场景上绘制一些对象。在普通的OpenGL中,我们必须不调用与绘制网格有关的函数。

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

使用QML可以做到这一点吗?还是应该在cpp文件中创建完整的渲染功能?

Bas*_*oud 6

对的,这是可能的。

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

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] : []
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案(可能有点困难)是在您在材质中使用的效果中使用过滤器。Effect 组件将有一个或多个 RenderPass。这些渲染通道中的每一个都可以有过滤器键:

RenderPass {
    id: myPass

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

    renderStates: [
        BlendEquationArguments {
            ...
        }, 
     ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


mkr*_*rus 5

最简单的方法实际上是将实体的enabled 属性设置为 false。

对于更精细和更通用的控制,您可以考虑使用QLayer组件。