我有一个要填充纹理的ARSCNPlaneGeometry。
当我将节点的SCNMaterial设置为alpha = 0.5的颜色时,一切正常。
// this works OK
let scenePlaneGeometry = ARSCNPlaneGeometry(device: MTLCreateSystemDefaultDevice()!)
scenePlaneGeometry?.update(from: planeAnchor.geometry)
let planeNode = SCNNode(geometry: scenePlaneGeometry)
planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(0.5)
当我将其设置为基于图像的纹理时,图像会缩放并似乎总是矩形,这不是我想要的。
// this does NOT work OK
let scenePlaneGeometry = ARSCNPlaneGeometry(device: MTLCreateSystemDefaultDevice()!)
scenePlaneGeometry?.update(from: planeAnchor.geometry)
let planeNode = SCNNode(geometry: scenePlaneGeometry)
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "FloorTexture")
planeNode.geometry?.firstMaterial = material
我现在的想法是采用类似这样的表面着色器,而不是为节点设置材质:
guard let path = Bundle.main.path(forResource: "my_super_shader", ofType: "metal", inDirectory: "Assets.scnassets")
else { fatalError("Can't find wireframe shader") }
do {
let shader = try String(contentsOfFile: path, encoding: .utf8)
material.shaderModifiers = [.surface: shader]
} catch {
fatalError("Can't load wireframe shader: \(error)")
}
但是由于几乎没有记录该着色器内容,所以我希望看到my_super_shader的示例着色器代码,该代码将一些线绘制到平面中。重要的是片段的背景(相机视图)保持透明,甚至可以通过alpha设置更好地控制。着色器只能在ARSCNPlaneGeometry的凸区域中绘制“十字线”(或类似图形)(而不能在ARSCNPlaneGeometry的矩形边界框中绘制)。
任何建议如何做到这一点?