RealityKit - 材质的 Alpha 透明度

4

是否可以在纹理中使用Alpha透明度?

我有一个包含8位RGBA的png文件,但由于某种原因,应该是透明的部分仅为黑色。

我按如下所示分配材质:

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)
}
2个回答

10

RealityKit 1.0

.tintColor.baseColor的乘数。

如果你有一个带有预乘alpha(RGB*A)的.png文件,你只需要额外使用一个tintColor实例属性,其alpha值为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)
}

似乎是iOS上RealityKit的一个bug - 为什么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的乘数。


visionOS中的RealityKit

在visionOS应用程序中,使用OpacityComponent更容易创建透明材质:

modelEntity.components[OpacityComponent.self] = .init(opacity: 0.25)

1
它的效果非常好,我一开始设置错了。听起来有点像黑客行为,所以可能更好的解决方案是创建一个具有特定表面着色器的自定义材质。 - 93sauu

1
在使用PhysicallyBasedMaterial时,色调颜色不起作用。您需要同时使用blending属性和opacityThresholdRealityKit 2.0 简单的解决方案是使用便捷方法创建一个接近于1的透明纹理。
此外,如果您想要在网格的两侧显示纹理(就像我的情况一样),您可以将faceCulling设置为none
var material = PhysicallyBasedMaterial()
material.baseColor = .init(texture: .init(myPNGTexture))
material.blending = .init(blending: .transparent(opacity: 0.9999))
material.opacityThreshold = 0.0 // IMPORTANT
material.faceCulling = .none

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接