微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CIFilter不能应用于SCNMaterial

如何解决CIFilter不能应用于SCNMaterial

将任何CIFilter应用于UIImageView都可以正常工作。

import UIKit
import CoreImage

@IBOutlet var imageView: UIImageView!
let ciBlurFilter = CIFilter(name: "CIGaussianBlur")!


func gaussianBlur() -> UIImage? {        
    let uiImage = UIImage(named: "texture.png")!
    let ciImage = CIImage(image: uiImage)
    ciBlurFilter.setValue(ciImage,forKey: "inputimage")
    let resultedImage = ciBlurFilter.value(forKey: "outputimage") as! CIImage
    let blurredImage = UIImage(ciImage: resultedImage)
    return blurredImage
}

override func viewDidLoad() {
    super.viewDidLoad()        
    imageView.image = self.gaussianBlur()
}

但是如果将其应用于SceneKit的材质,则无法使用

import SceneKit

@IBOutlet var sceneView: SCNView!
let ciBlurFilter = CIFilter(name: "CIGaussianBlur")!


func gaussianBlur() -> UIImage? {        
    let uiImage = UIImage(named: "texture.png")!
    let ciImage = CIImage(image: uiImage)
    ciBlurFilter.setValue(ciImage,forKey: "inputimage")
    let resultedImage = ciBlurFilter.value(forKey: "outputimage") as! CIImage
    let blurredImage = UIImage(ciImage: resultedImage)
    return blurredImage
}

override func viewDidLoad() {
    super.viewDidLoad()
    sceneView.scene = SCNScene()       
    let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))
    sphereNode.geometry?.firstMaterial?.diffuse.contents = self.gaussianBlur()
    sceneView.scene?.rootNode.addChildNode(sphereNode)
}

为什么带有CIFilter的SCNMaterial不可见(尽管它支持UIImage)?

怎么了?

解决方法

使用该构造函数创建的UIImage当时实际上并未呈现。图片的接收者需要知道图片需要在使用之前进行渲染,这似乎不是由SceneKit处理的。

有关详细信息,请参见我的答案here

以下是在Swift中渲染CIImage的方法:

// ideally you create this once and re-use it;
// you should not create a new context for every draw call
let ciContext = CIContext()

let cgImage = ciContext.createCGImage(ciImage,from: ciImage.extent)
let uiImage = cgImage.flatMap({ UIImage.init(cgImage: $0) })

您可以将CGImage传递到材料或将其包装到UIImage中,两者都应该起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。