带有几个密钥的QT3D QML RenderPassFilter似乎有问题

时间:2017-06-01 15:16:23

标签: qml qt3d

我刚开始使用QML创建QT3D场景。 我想过滤使用RenderPassFilter渲染场景的哪些元素。 这是我非常简单的渲染器:

import Qt3D.Core 2.0
import Qt3D.Render 2.0

Viewport {
  id: root
  property color clearColor: Qt.rgba(0, 0, 0.2, 1)
  property Camera mainCamera

  RenderSurfaceSelector {
    id: surfaceSelector

    // Clear Buffer
    ClearBuffers {
      buffers: ClearBuffers.ColorDepthBuffer
      clearColor: root.clearColor
      NoDraw {}
    }


    RenderPassFilter {
      matchAny: [FilterKey{name: "type"; value: "filter1"}] // <-- THIS LINE IS THE FILTER 

      CameraSelector {
        id: selector
        camera: mainCamera
      }
    }
  }
}

这会正确显示包含FilterKey{name: "type"; value: "filter1"}

的所有元素(仅限那些元素)

用另一个过滤器替换它可以正常工作:

RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter2"}] // <-- THIS LINE IS THE FILTER 

  CameraSelector {
    id: selector
    camera: mainCamera
  }
}

将显示具有过滤器值filter2而非filter1

的对象集

现在我的问题是matchAny字段是一个列表,所以我会怀疑它能够带几个元素。不幸的是,以下内容根本不显示任何元素

RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter1"}, FilterKey{name: "type"; value: "filter2"}] // <-- THIS LINE IS THE FILTER 

  CameraSelector {
    id: selector
    camera: mainCamera
  }
}

我希望这会渲染所有带有值filter1或值filter2的元素。实现这个目标的方法是什么?

编辑:我刚发布时发现matchAny可能与我的情况相反:元素中的任何过滤键都必须匹配matchAny列表中的内容(但是所有列表必须匹配)...如果这是有道理的。无论如何,问题仍然存在:我如何使用RenderPassFilter来允许包含filter1filter2的元素?

1 个答案:

答案 0 :(得分:0)

好的,经过多次试验,我得到的是:

1)我在问题编辑中所写的内容是正确的:使用

RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter1"}]
  // ... stuff
}

表示如果渲染过程包含至少过滤器FilterKey{name: "type"; value: "filter1"}

,则会对该过程进行验证

2)测试的唯一方法是传递类型filter1 filter2是创建两个不同的renderPassFilters:

RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter1"}]
  // ... stuff
}
RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter2"}]
  // ... stuff
}