2016-10-10 4 views
2

Ich bin mit zwei SCNView ‚s für meine Schnittstelle Zeichnung, und ich habe eine SpriteKit Overlay (auf der obersten SCNView für HUD wie Funktionen. Auf macOS 10.11 (El Capitan) alles funktioniert gut, aber auf 10,12 (Sierra) scheint die Überlagerung mit dem alpha Hintergrund gemischt wirdFalsche Zeichnung mit SceneKit mit Overlay auf macOS Sierra

Vergleichen 10.11 (erwartete Ausgabe).

macOS 10.11

mit dem Ausgang 10.12:

macOS 10.12 fully transparent background

Die Ansicht Stack ist:

  • SCNView (opaque schwarzer Hintergrund)
  • SCNView (clear background)
    • SpriteKit overlay (teilweise transparent, teilweise opak)

Das gelbe Quadrat (Alpha = 0,50) und das rote Quadrat (opak) stammen von der Überlagerung. Der weiße Würfel wird im obersten (transparenten) SCNView gezeichnet.

Als ich den Hintergrund halbtransparent machen, mehr der Quadrate wird sichtbar, noch verbleibende transparent:

macOS 10.12 semi transparent background

Der Code für diese Einstellung ist:

sceneView.scene=SCNScene() 
    sceneView.scene?.rootNode.addChildNode(SCNNode(geometry: SCNBox(width: 10, height: 10, length: 10, chamferRadius: 1))) 

    //An overlay 
    let overlayScene=SKScene(size: CGSize(width: 500, height: 10)) 
    overlayScene.scaleMode = .resizeFill 

    let bar=SKSpriteNode(color: NSColor.yellow.withAlphaComponent(0.5), size: CGSize(width: 250, height: 40)) 
    bar.anchorPoint=CGPoint.zero 

    let smallBar=SKSpriteNode(color: NSColor.red, size: CGSize(width: 250, height: 20)) 
    smallBar.position=CGPoint(x: 125, y: 20) 

    bar.addChild(smallBar) 
    overlayScene.addChild(bar) 

    sceneView.overlaySKScene=overlayScene 

    //Optionally: 
    sceneView.backgroundColor=NSColor.black.withAlphaComponent(0.5) 

Ich konnte nicht gefunden Alles, um Sierra dazu zu bringen, das Overlay korrekt zu rendern, wie das Einstellen des Mischmodus der SpriteKit-Szene.

Irgendwelche Vorschläge, wie ich dieses Zeichnungsproblem beheben kann?

+0

Sieht aus wie ein Problem mit linearen Farbraum. Können Sie versuchen, den Schlüssel "SCNDisableLinearSpaceRendering" in Ihrer Datei "info.plist" auf "YES" zu setzen? – Toyos

+0

Das gibt das korrekte Transparenzverhalten. Die Farben sind jedoch noch ein bisschen anders. Ich konnte wirklich keine wirklichen Informationen darüber finden, wie alles funktioniert und warum das Overlay im Hintergrund mit linearem Raum-Rendering verschwinden würde. Hast du eine Dokumentation? –

Antwort

1

Gibt es etwas, das Sie uns nicht zeigen? Es funktioniert für mich mit Projekten, die mit Xcode 7 oder Xcode 8 erstellt wurden, auf einem MacBook Pro mit 10.12. Vielleicht ist es ein Grafikkartenproblem?

enter image description here

Ich sehe nicht, wo Sie den Mischmodus der SKOverlay sind zu ändern. Daher wird standardmäßig .alpha pro Dokument angegeben.

Um mein Projekt zu reproduzieren, beginnen Sie mit der Xcode SceneKit Spielvorlage. Entfernen Sie die mouseDown Definition aus der GameView Klasse. Import SpriteKit in GameViewController.swift und ersetzt awakeFromNib mit diesem:

override func awakeFromNib(){ 
    super.awakeFromNib() 

    // create a new scene 
    gameView.scene=SCNScene() 
    gameView.scene?.rootNode.addChildNode(SCNNode(geometry: SCNBox(width: 10, height: 10, length: 10, chamferRadius: 1))) 

    //An overlay 
    let overlayScene=SKScene(size: CGSize(width: 500, height: 10)) 
    overlayScene.scaleMode = .resizeFill 

    let bar=SKSpriteNode(color: NSColor.yellow.withAlphaComponent(0.5), size: CGSize(width: 250, height: 90)) 
    bar.anchorPoint=CGPoint.zero 

    let smallBar=SKSpriteNode(color: NSColor.red, size: CGSize(width: 250, height: 30)) 
    smallBar.position=CGPoint(x: 125, y: 50) 

    bar.addChild(smallBar) 
    overlayScene.addChild(bar) 

    gameView.overlaySKScene=overlayScene 

    //Optionally: 
    gameView.backgroundColor=NSColor.black.withAlphaComponent(0.5) 

    // create and add a camera to the scene 
    //  let cameraNode = SCNNode() 
    //  cameraNode.camera = SCNCamera() 
    //  gameView.scene!.rootNode.addChildNode(cameraNode) 

    // place the camera 
    //  cameraNode.position = SCNVector3(x: 0, y: 0, z: 15) 

    // create and add a light to the scene 
    let lightNode = SCNNode() 
    lightNode.light = SCNLight() 
    lightNode.light!.type = SCNLight.LightType.omni 
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10) 
    //  gameView.scene!.rootNode.addChildNode(lightNode) 

    // create and add an ambient light to the scene 
    let ambientLightNode = SCNNode() 
    ambientLightNode.light = SCNLight() 
    ambientLightNode.light!.type = SCNLight.LightType.ambient 
    ambientLightNode.light!.color = NSColor.darkGray 
    //  gameView.scene!.rootNode.addChildNode(ambientLightNode) 

    // allows the user to manipulate the camera 
    self.gameView!.allowsCameraControl = true 

    // show statistics such as fps and timing information 
    //  self.gameView!.showsStatistics = true 

} 
+0

Danke für Ihre Antwort. Bitte entferne die letzte Zeile von 'awakeFromNib()'. Ich glaube, du hast den Teil vermisst, bei dem mein (oberster) 'SCNView' transparent ist. Ihr Projekt zeigt dann das gleiche Verhalten wie meines. –

+0

Nicht nur das, ich vermisste den Teil über zwei verschiedene SCNViews übereinander! Hier ist eine überarbeitete Ansicht. Ich denke, ich werde diese Antwort hier lassen, aber es ist keine Lösung. –

+0

Was mich ein wenig überrascht, ist, dass Ihr neuer Screenshot nicht zeigt, dass die Quadrate transparent werden. Als ich die letzte Zeile in meiner Kopie entfernte, wurde der (graue) Hintergrund hinter beiden Quadraten sichtbar, ähnlich wie in meinem dritten Screenshot. –

0

Wenn Sie Ihre SCNView Unterklasse, überschreibt das viewDidMoveToWindow() Methode und nicht nennen super.viewDidMoveToWindow() innerhalb dieses Verfahrens kann es funktionieren. Ich hatte ein sehr ähnliches Problem beim Hinzufügen einer overlaySKScene zu einem SCNView und dies behob das Farbproblem. Die Ansicht kann jedoch aus irgendeinem Grund zunächst rot blinken.