SceneKit Cocoa快照失败断言

Bob*_*421 18 macos xcode scenekit metal

我正在研究Swift/Cocoa/Xcode应用程序.

此应用程序包含SceneKit视图.渲染API设置为Default(我认为这是Metal).

如果我snapshot()在这个SceneKit视图对象上运行,我收到此错误消息.我想要做的是从相机中捕获场景的UIImage

Texture PixelFormat MTLPixelFormatBGRA8Unorm does not match Resolve PixelFormat MTLPixelFormatRGBA8Unorm
Run Code Online (Sandbox Code Playgroud)

如果我将渲染API设置为OpenGL,我没有错误,一切正常.

我在iOS应用程序上尝试过相同的东西,它适用于两种情况(Metal或OpenGL).

我不明白为什么我会收到这个错误,我应该怎么做以避免它.

这是示例代码:

import SceneKit
import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var vue_scene: SCNView!
    @IBOutlet weak var img_snapshot: NSImageView!

    let camera_node = SCNNode()
    var box_node:SCNNode = SCNNode()

    override func viewDidLoad() {
        super.viewDidLoad()

        let scene = SCNScene()
        vue_scene.scene = scene

        vue_scene.backgroundColor = NSColor.clear

        vue_scene.showsStatistics = false
        vue_scene.allowsCameraControl = false
        vue_scene.autoenablesDefaultLighting = true

        camera_node.camera = SCNCamera()
        camera_node.camera?.zNear = 0.01
        camera_node.camera?.zFar = 1000000.0
        vue_scene.pointOfView = camera_node
        vue_scene.scene!.rootNode.addChildNode(camera_node)

        let box = SCNBox(width: 10.0, 
                        height: 10.0, 
                        length: 10.0, 
                  chamferRadius: 0.0)
        box.firstMaterial?.diffuse.contents = NSColor.red

        box.firstMaterial?.isDoubleSided = true
        box_node = SCNNode(geometry:box)
        box_node.position = SCNVector3Make(0,0,0)
        box_node.opacity = 1.0
        vue_scene.scene!.rootNode.addChildNode(box_node)

        camera_node.position = SCNVector3Make(
                   0.0,
                   0.0,
                  70.0)
    }

    @IBAction func on_btn(_ sender: Any) {
        // signal SIGABRT here:
        // /Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/ToolsLayers/Debug/MTLDebugCommandBuffer.mm:215: failed assertion `Texture PixelFormat MTLPixelFormatBGRA8Unorm does not match Resolve PixelFormat MTLPixelFormatRGBA8Unorm'
        let image = vue_scene.snapshot()
        img_snapshot.image = image;
    }
}
Run Code Online (Sandbox Code Playgroud)

ARG*_*Geo 2

它适用于金属。

在 macOS 中,使用Tab View(例如)来容纳SceneViewNSImageView

我还在 macOS 12.3 Monterey 上的 Xcode 13.3 中测试了它。

import SceneKit
import Cocoa

class ViewController: NSViewController {
    
    @IBOutlet var sceneView: SCNView!
    @IBOutlet var imageView: NSImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()            
        sceneView.scene = SCNScene()
        
        sceneView.pointOfView?.position.z = 20
        sceneView.allowsCameraControl = true
        sceneView.showsStatistics = true
        sceneView.backgroundColor = NSColor.black
        sceneView.autoenablesDefaultLighting = true

        let box = SCNBox(width: 1.0, height: 1.0,
                        length: 1.0, chamferRadius: 0.0)
        
        box.firstMaterial?.diffuse.contents = NSColor.systemTeal

        let boxNode = SCNNode(geometry: box)
        boxNode.position = SCNVector3(0,0,-10)
        sceneView.scene!.rootNode.addChildNode(boxNode)
    }
    
    @IBAction func createSnapshot(_ sender: NSButton) {
        let image = sceneView.snapshot()
        imageView.image = image
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述