visionOS : any non-nil preferredSurroundingsEffect enables a light-spill halo around VideoPlayerComponent video

Hi all — sharing a platform behavior I isolated while building a custom immersive video player, in case others hit it (and to ask whether it's intended).

Finding On visionOS 27 (Xcode 27), an entity playing video via VideoPlayerComponent(videoRenderer:) gets a light-spill "screen glow" halo around its edges whenever the immersive space declares any non-nil preferredSurroundingsEffect. The halo follows the video's colors frame by frame. With no surroundings effect (nil), there is no halo.

Quick repro

  • Progressive immersive space + VideoPlayerComponent playing.
  • Add .preferredSurroundingsEffect(.dim(intensity: 0.0)) → halo appears (even though the effect is visually a no-op).
  • Remove it → halo disappears.

Same with .colorMultiply(_:) and preset effects.

Things I ruled out on device (Vision Pro)

  • ImmersiveContentBrightness (.custom(1.0) vs .automatic): no difference.
  • VideoPlayerComponent configuration (.stereo, spatial video mode, isPassthroughTintingEnabled) and component attach timing: no difference.
  • Presenting the same video via VideoMaterial: no halo. Bright white SwiftUI content: no halo.

Questions

  1. Is this coupling intended? The preferredSurroundingsEffect docs don't mention any effect on video playback.
  2. Is there a public way to keep a surroundings effect (e.g. room dimming) while avoiding the video light spill? I found none on VideoPlayerComponent.

Current workaround: don't declare any surroundings effect in the modes where the halo is undesirable. Also filed via Feedback Assistant(FB25130748). Curious if anyone else has seen this or knows a switch.

Thank you for your question @Linggan-uas! And thank you for submitting a feedback ticket. If you haven't already, check out Bug Reporting: How and Why?.

To help us out a bit more, can you describe your use case? You can share any screenshots or example projects with us confidentially in the ticket you created. Is the halo effect you're seeing bleeding into and affecting the other content you are trying to display to the user, and if so, how? These details will help us understand the problem better.

Thanks for the quick response!

Use case: I'm building PrismXR, a third-party media player for Apple Vision Pro. It plays local / SMB / WebDAV / Emby media inside custom immersive environments (a virtual theater: our own room geometry plus a virtual screen). Video is decoded by our own pipeline (FFmpeg demux + VideoToolbox) and presented with AVSampleBufferVideoRenderer + VideoPlayerComponent — the AVKit "dock in a scene" path isn't usable for us because we deliver our own sample buffers (network streaming, seek/rate control, real-time 3D, color grading). Each environment declares its own surroundings appearance: room dimming in passthrough mode (.dim / .colorMultiply), and previously a subtle colorMultiply tint in the virtual studio / cinema rooms.

Does the halo bleed into other content? Yes — three ways:

  1. It bleeds onto our custom environment geometry. Our rooms implement their own screen light / reflection (floor light spill computed in the scene's shader). The system halo shows up as a second, uncontrolled video-colored glow around the screen edge, layered on top of ours. We can't tune its color, radius or falloff to match the environment, so it reads as a duplicate light source coming from nowhere in the scene.

  2. In fully immersive spaces it pollutes what should be black. We deliberately use a pure black surrounding for focused viewing; the halo paints a video-colored glow into it.

  3. It makes the screen edge itself look hazy. On a large virtual cinema screen the edge glow reduces perceived contrast and reads as a display artifact — and it is visible even when the surroundings effect itself is visually a no-op (.dim(intensity: 0)).

Practical impact: because the halo is gated on "the app declared any non-nil preferredSurroundingsEffect", we had to remove our surroundings declarations in the studio / cinema / ATV environments to get rid of it — losing the intended tint there. Only passthrough mode still declares one (the room-dimming slider is a real feature there) and that mode simply has to live with the halo.

I can attach A/B captures (same video, with and without the surroundings modifier) and, if useful, a minimal sample project to the feedback ticket — happy to provide whichever helps most.

Thanks!