Как заполнить ARSCNPlaneGeometry текстурой, используя металлический шейдер? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть 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).

Есть предложения, как это сделать?

...