如何解决带有SceneKit的ARKit –在半透明漫射材质上进行绑带
我很难从SceneKit中删除此条带。
可以使用漫反射图像(在此处添加黑色背景以进行对比)(如果您在此处看到一些条纹是由于上传后的压缩情况所致)
没有条纹,但这是arkit中的结果(我遮挡了相机以深色背景)
代码是:
var bloomBackground = UIImage(named: "diffuse_map_02")!.withRenderingMode(.alwaysTemplate)
bloomBackground = bloomBackground.maskWithColor(color: UIColor(hex: baseColorFullOpacity))
bNode.geometry?.firstMaterial?.diffuse.contents = bloomBackground
我是否缺少设置任何标志来消除此条纹问题?
解决方法
解决方案I
在计算机图形学中,梯度上的带状伪像很常见。要消除条纹,通常需要使用模糊处理。这是一个代码,可帮助您为SceneKit漫反射材料做到这一点:
import SceneKit
class ViewController: UIViewController {
@IBOutlet var sceneView: SCNView!
let ciContext = CIContext()
fileprivate func gaussianBlur() -> UIImage? {
let uiImage = UIImage(named: "art.scnassets/banding.png")!
let ciImage = CIImage(image: uiImage)
guard let ciBlurFilter = CIFilter(name: "CIGaussianBlur")
else { return nil }
ciBlurFilter.setValue(ciImage,forKey: "inputImage")
let resultedImage = ciBlurFilter.value(forKey: "outputImage") as! CIImage
var blurredImage = UIImage(ciImage: resultedImage)
let cgImage = ciContext.createCGImage(resultedImage,from: resultedImage.extent)
blurredImage = cgImage.flatMap { UIImage(cgImage: $0) }!
return blurredImage
}
override func viewDidLoad() {
super.viewDidLoad()
sceneView.scene = SCNScene()
let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.2))
sphereNode.geometry?.firstMaterial?.diffuse.contents = gaussianBlur()
sceneView.scene?.rootNode.addChildNode(sphereNode)
}
}
解决方案II
在生成的源中,无法以16位和32位图像(例如.psd
,.hdr
,.tiff
或.exr
文件格式)进行合并。常规.png
或.jpg
每通道为8位。
增加8位图像的大小不会带来正面的结果。那是因为每个通道仍然有256个灰色半色调。但是,如果使用16位.tiff
,则每个通道将获得65536阶灰色。是8位图片的256倍。
但是,让我们看看苹果公司documentation says对此有何看法。
尽管图像对象支持所有平台本机图像格式,但建议您对应用中的大多数图像使用
PNG
或JPEG
文件。图像对象已针对读取和显示两种格式进行了优化,并且这些格式提供的性能优于大多数其他图像格式。由于PNG格式是无损的,因此特别推荐您在应用界面中使用的图片。
因此Apple试图告诉我们,可以使用16位和32位文件,但闻起来像non-optimized
的开发方式。如果您打算在SCNScene中渲染太多32位纹理,请准备好获取冻结的(无响应)视图。
我亲自尝试使用.hdr
,.tiff
和.exr
文件格式,它们看起来不错。不能100%确定,但是我认为您可以利用16位和32位.psd
文件,但是我认为在将它们导入Xcode项目之前,必须先将它们弄平(成为单层)。>
解决方案III
您可以以编程方式构建CIFilter的CISmoothLinearGradient。该过滤器具有四个参数:
- inputPoint0(CIVector)
- inputPoint1(CIVector)
- inputColor0(CIColor)
- inputColor1(CIColor)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。