У меня есть ARSCNPlaneGeometry, которую я хочу заполнить текстурой.
Когда я устанавливаю SCNMaterial узла в цвет с альфа = 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, который рисует некоторые линиив самолет.Важно то, что фон фрагментов (вид с камеры) остается прозрачным или даже лучше управляемым с настройкой альфа.Шейдер должен ТОЛЬКО рисовать линии «перекрестие» (или тому подобное) в выпуклой области ARSCNPlaneGeometry (НЕ в прямоугольную ограничивающую рамку ARSCNPlaneGeometry).
Есть предложения, как это сделать?