I’m seeing a device-only lighting discontinuity on PBR entities that intersect a RealityKit portal plane in visionOS 27.
A sharp brightness boundary appears exactly where the portal plane cuts through the entity. The portion outside the portal receives a different physical environment-probe contribution from the portion inside.
The behavior is reproducible with two independent cases:
- A completely static blue sphere positioned across the portal plane.
- An orange sphere moved through the portal using ManipulationComponent and the standard visionOS pinch gesture.
Both spheres use:
var material = PhysicallyBasedMaterial()
material.baseColor = .init(tint: .orange)
material.metallic = 0
material.roughness = 1
Each sphere has the crossing and lighting components attached directly:
sphere.components.set(PortalCrossingComponent())
sphere.components.set(
ImageBasedLightReceiverComponent(
imageBasedLight: portalImageBasedLight
)
)
var lightingConfiguration =
EnvironmentLightingConfigurationComponent()
lightingConfiguration.environmentLightingWeight = 0
sphere.components.set(lightingConfiguration)
The portal is created using the visionOS 27 factory API:
let portal = PortalComponent.makePortal(
surfaceStyle: .init(width: 1.2, height: 0.8),
boundaryStyle: .infinitePlane(),
boundaryMode: .clippingAndCrossing
)
if var component =
portal.portalEntity.components[PortalComponent.self] {
component.lightingBlendDistance = 0.2
portal.portalEntity.components.set(component)
}
For the moving sphere, environmentLightingWeight stays at 0 for the entire interval in which any part of the sphere intersects the portal. The realtime environment-probe contribution only begins fading from 0 to 1 after the complete sphere has cleared the plane.
However, a spatially sharp edge remains:
-
- In a bright physical environment, the outside portion is brighter.
-
- In a dark physical environment, the outside portion is darker.
-
- With
UnlitMaterial,the edge disappears completely.
- With
-
- With PBR—even metallic 0 and roughness 1—the edge returns.
-
- The static sphere reproduces the issue, so it does not appear to be caused by gesture or lighting-update timing.
-
- Changing
lightingBlendDistancedoes not soften this remaining edge.
- Changing
-
- The issue is visible on Apple Vision Pro but not in visionOS Simulator.
I watched the portal-lighting section of WWDC24 session 10103 and implemented the recommended EnvironmentLightingConfigurationComponent solution. I have also reviewed the documentation for PortalComponent, PortalCrossingComponent, PortalComponent.makePortal, ImageBasedLightReceiverComponent, and environmentLightingWeight.
Is there another component or entity-hierarchy requirement needed to fully suppress the physical environment probe on the host-side fragments of a crossing PBR entity? Or is this a RealityKit rendering issue on physical hardware?
Environment:
- Apple Vision Pro (M5)
- visionOS 27.0 (24M5326g)
- Xcode 27.0 (27A5228h)
- visionOS SDK 27.0 (24M5326e)
Here is a minimal standalone Xcode reproduction containing both the static and pinch-draggable spheres: https://drive.google.com/file/d/13qqOlDJVCCtlFcMaHCBpDkVJgRzmNjBK/view?usp=sharing
Hey @psqv,
Thanks so much for filing your bug report (FB24168838). This is an issue we're aware of and have identified a potential fix for a future OS update. Your report will be updated when it is resolved.
We're not aware of any recommended workaround so far. If you find something that helps you avoid the issue, please share it with the community by posting it here.
For those following along, even though we're aware of this issue, we still encourage you to open a bug report, and post the FB number here once you do. The specific info you include your bug report might help our investigation, and filing the bug report you to get notified when it is resolved.
Bug Reporting: How and Why? explains how you can open a bug report.
Thanks,
Michael