带有SceneKit的ARKit –在半透明漫射材质上进行绑带

问题描述

我很难从SceneKit中删除此条带。

可以使用漫反射图像(在此处添加黑色背景以进行对比)(如果您在此处看到一些条纹是由于上传后的压缩情况所致)

enter image description here

没有条纹,但这是arkit中的结果(我遮挡了相机以深色背景)

enter image description here

代码是:

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对此有何看法。

尽管图像对象支持所有平台本机图像格式,但建议您对应用中的大多数图像使用PNGJPEG文件。图像对象已针对读取和显示两种格式进行了优化,并且这些格式提供的性能优于大多数其他图像格式。由于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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...