2

我刚开始使用 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
  }
}

我希望这可以渲染所有具有 valuefilter1或 value的元素filter2。实现这一目标的方法是什么?

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

4

1 回答 1

2

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

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

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

意味着如果渲染通道至少包含过滤器,它将被执行FilterKey{name: "type"; value: "filter1"}

2) 测试 pass 是否具有类型filter1 filter2创建两个不同的 renderPassFilters 的唯一方法:

RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter1"}]
  // ... stuff
}
RenderPassFilter {
  matchAny: [FilterKey{name: "type"; value: "filter2"}]
  // ... stuff
}
于 2017-06-06T09:15:17.400 回答