RealityKit - альфа-прозрачность материала

Возможно ли иметь альфа-прозрачность с текстурами?

У меня есть файл png, который содержит 8-битный RGBA, но по какой-то причине предполагаемые прозрачные части просто черные.

Назначаю материал так:

private func setupLightMeshes(_ scene: Entity) {
    let lightEntity = scene.findEntity(named: "LightWindow_Plane")!
    var lightMaterial = UnlitMaterial()
    
    lightMaterial.baseColor = try! MaterialColorParameter.texture(
    TextureResource.load(named: "light.png")) // this is 8bpc RGBA
    var modelComponent = lightEntity.components[ModelComponent] as! ModelComponent
    modelComponent = ModelComponent(mesh: modelComponent.mesh, materials: [lightMaterial])
    lightEntity.components.set(modelComponent)
}

person Raildex    schedule 20.08.2020    source источник


Ответы (1)


RealityKit 1.0

.tintColor - множитель для .baseColor

Если у вас есть .png файл с предварительно умноженным альфа-каналом (_4 _ * _ 5_). все, что вам нужно сделать, это дополнительно использовать свойство экземпляра tintColor с альфа, равным 0.9999.

material.tintColor = UIColor(white: 1.0, alpha: 0.9999)


Вот как это выглядит в реальном коде:

fileprivate func material() -> UnlitMaterial {

    var material = UnlitMaterial()
    material.baseColor = try! .texture(.load(named: "transparent.png"))
    material.tintColor = UIColor(white: 1.0, alpha: 0.9999)
    return material
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    let sphere: MeshResource = .generateSphere(radius: 0.5)

    let entity = ModelEntity(mesh: sphere,
                        materials: [material()])

    let anchor = AnchorEntity()
    anchor.orientation = simd_quatf(angle: .pi, axis: [0, 1, 0])

    anchor.addChild(entity)
    arView.scene.anchors.append(anchor)
}

P.S.

Для меня это похоже на ошибку в RealityKit 1.0. Я не понимаю, почему метод .load(named: "file.png") не работает должным образом.


RealityKit 2.0

Та же история с частично прозрачными текстурами в RealityKit 2.0:

var material = SimpleMaterial()

material.color = try! .init(tint: .white.withAlphaComponent(0.9999),
                         texture: .init(.load(named: "semi.png", in: nil)))

Параметр tint также является множителем для texture.

person Andy Fedoroff    schedule 24.08.2020