2017-06-01 2 views
0

Ich begann gerade mit QML, um eine QT3D-Szene zu erstellen. Ich möchte filtern, welche Elemente meiner Szene mit einem RenderPassFilter gerendert werden. Hier ist meine wirklich einfach Renderer:QT3D QML RenderPassFilter mit mehreren Tasten scheint abgehört

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 
     } 
    } 
    } 
} 

Diese ordnungsgemäß alle Elemente zeigt (und nur die), die eine FilterKey{name: "type"; value: "filter1"}

Ersetzen dieser mit einem anderen Filter funktioniert gut enthält:

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

    CameraSelector { 
    id: selector 
    camera: mainCamera 
    } 
} 

wird Anzeige des Objektsatzes mit dem Filterwert filter2 anstelle von filter1

Jetzt ist mein Problem, dass das MatchAny Feld eine Liste ist, also würde ich es akzeptieren, um mehrere Elemente zu nehmen. Leider ist die folgende nicht an alles, was ich diese alle Elemente machen würde erwarten

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

    CameraSelector { 
    id: selector 
    camera: mainCamera 
    } 
} 

jedes Element angezeigt werden entweder mit Wert filter1 oder Wert filter2. Wie kann man das erreichen?

EDIT: Ich habe erkannt, während dies, dass matchAny Entsendung könnte das Gegenteil von dem bedeuten, was ich aber: jeder Filterschlüssel in einem Elemente übereinstimmen muss, was int die matchAny Liste ist (aber die ganze Liste muss angepasst werden). .. wenn das Sinn macht. Wie auch immer, die Frage bleibt: Wie kann ich einen RenderPassFilter verwenden, um Elemente zu erlauben, die entweder filter1 oder filter2 enthalten?

Antwort

0

Ok, also nach vielen Versuchen, ich, was habe ich ist:

1) Was ich in der Frage des bearbeiten schrieb richtig: wenn

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

bedeutet, dass ein Render Pass exectued verwenden werden es enthält mindestens das Filter FilterKey{name: "type"; value: "filter1"}

2) der einzige Weg, ein Einpass-Typ hat zu testen, ist filter1oderfilter2 erstellt zwei verschiedene renderPassFilter:

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