I've set up an SKRenderer
to render an SKScene
into an MTKView
on macOS. However any SKShapeNode
s in the scene render like this as though they're ignoring the alpha values:
Here is my ViewController where the SKRenderer is set up:
import Cocoa
import SpriteKit
import MetalKit
class ViewController: NSViewController {
var device: MTLDevice!
var renderer: SKRenderer!
var commandQueue: MTLCommandQueue!
var scene: GameScene!
var mtkView = MTKView()
override func viewDidAppear() {
super.viewDidAppear()
device = MTLCreateSystemDefaultDevice()
renderer = SKRenderer(device: device)
commandQueue = device.makeCommandQueue()
scene = GameScene(size: view.bounds.size)
scene.scaleMode = .aspectFill
renderer.scene = scene
mtkView.device = device
mtkView.delegate = self
mtkView.isPaused = false
view.addSubview(mtkView)
}
override func viewDidLayout() {
mtkView.frame = view.bounds
}
}
My MTKViewDelegate where the SKRenderer renders in Metal:
extension ViewController: MTKViewDelegate {
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { }
func draw(in view: MTKView) {
let commandBuffer = commandQueue.makeCommandBuffer()!
let renderPassDescriptor = view.currentRenderPassDescriptor!
renderer.render(withViewport: view.bounds, commandBuffer: commandBuffer, renderPassDescriptor: renderPassDescriptor)
commandBuffer.present(view.currentDrawable!)
commandBuffer.commit()
}
}
And my basic GameScene:
import SpriteKit
class GameScene: SKScene {
override init(size: CGSize) {
super.init(size: size)
anchorPoint = CGPoint(x: 0.5, y: 0.5)
let circle = SKShapeNode(ellipseOf: CGSize(width: size.width / 2, height: size.height / 2))
circle.fillColor = SKColor.green
circle.strokeColor = SKColor.blue
addChild(circle)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
anchorPoint = CGPoint(x: 0.5, y: 0.5)
let circle = SKShapeNode(ellipseOf: CGSize(width: size.width / 2, height: size.height / 2))
circle.fillColor = SKColor.green
circle.strokeColor = SKColor.clear
addChild(circle)
}
}
I'm pretty new to Metal so I'm sure that I'm just missing something basic.