Add a Fade Start property to ReflectionProbe
The default value of 0.5 makes reflections from ReflectionProbes more visible. This significantly reduces the notorious "sky is visible through solid objects in reflections" issue that people tend to notice when setting up reflection probes in Godot. If you set it to 1.0 in an indoor scene, the issue should be entirely prevented now, provided the probe's origin is not within solid one-sided geometry.
Please test this on more complex scenes to check if the proposed default value is actually a good idea. It may be a bit too aggressive; perhaps 0.2 would be a better fit.
To get the old behavior back, set Fade Start to 0.0.
See https://github.com/godotengine/godot-proposals/issues/3013.
Testing project: test_reflection_probes_mirage_palace.zip
Preview
| Before (Fade Start 0.0) | After (Fade Start 0.5, default) |
|---|---|
Fade Start 1.0 is meant to be used when you have a single probe cover an entire room, so it's not the best fit for this situation, but here it is anyway for comparison purposes:
| After (Fade Start 0.85) | After (Fade Start 1.0) |
|---|---|
TODO
- [x] Implement in Compatibility.
Works fine but with Fade Start at 0 between a inside and outside probe you get that fine line
Edit: I ment 1.0 for Fade Start

Works fine but with
Fade Startat 0 between a inside and outside probe you get that fine line
Fade Start = 0.0 is the existing behavior in master. Do you get this issue without this PR?
@Calinou sorry, I ment 1.0
@Calinou sorry, I ment 1.0
In that case, I'm not sure how this can be prevented due to floating-point precision issues. You can make ReflectionProbes slightly overlap each other to work around this.
They are overlap already. That happen at the end of the Reflection Probes set as inside: false
Edit: One way of solving this is to add a parameter fade away the sky from the edge of the reflection probes and other parameter to fade away the probe into another probe. This will fix transitions like this also

They are overlap already. That happen at the end of the Reflection Probes set as
inside: falseEdit: One way of solving this is to add a parameter fade away the sky from the edge of the reflection probes and other parameter to fade away the probe into another probe. This will fix transitions like this also
That way you can completely fade away the sky reflection in the edge but smootly fade away the probe with other probes and avoid this issue

One more situation where this popped up: https://www.reddit.com/r/godot/comments/10gux8y/why_is_the_skybox_overlaying_the_reflection/
In this particular example (mostly outdoor scene), increasing Fade Start would do the trick well.
What is needed is for us to save a depth map with the reflection probe and then use the depth map to blend.
Is this cheap enough to be feasible on the Forward Mobile backend, let alone Compatibility? Would this be something you need to enable on every ReflectionProbe (for performance reasons), or would it always be done?
What is needed is for us to save a depth map with the reflection probe and then use the depth map to blend.
Isn't that literally the same as adding lights with shadows to the scene? That can't be good for performance if it's enabled by default despite it fixing issues. I think being able to customize fade start is many times better.
Rebased and tested again in both Forward+ and Mobile, it works as expected. (Compatibility doesn't support reflection probes yet.)
@jcostello I've fixed the issue you mentioned by decreasing the MAX() threshold from 0.001 to 0.00001 in the inv_fade_start setter on the C++ side.
@Calinou nice, I'm testing this again
@Calinou The issue seems to be fixed. I love the result. Much more artistic control and blend happen more natural between inside and outside.
@Calinou is this ready to merge?
@Calinou is this ready to merge?
This needs a final review from other rendering contributors (I can't merge my own PRs).
Artifacts have expired and I'd like to test this since my original proposal is being mentioned quite a lot here. I agree with ClayJohn, I'm not sure this actually resolves the proposal. Is there a build with this available somewhere?
Is there a build with this available somewhere?
If you dont mind running a build someone else compiled, I can make one.
EDIT: Hold on, can the automatic builds be re-run?
Is there a build with this available somewhere?
If you dont mind running a build someone else compiled, I can make one.
EDIT: Hold on, can the automatic builds be re-run?
When testing features I’d prefer to use an automatic or official build for security reasons. Thank you for the offer though!
I've pushed a rebase with no changes to create a new build (check back in 1 hour).
I agree with ClayJohn, I'm not sure this actually resolves the proposal.
I don't intend this PR to resolve the linked proposal, which is why it doesn't say "closes" before the PR link. However, I believe this feature is still needed for artistic control (and it can help somewhat if you encounter the sky occlusion situation).
I've pushed a rebase with no changes to create a new build (check back in 1 hour).
I agree with ClayJohn, I'm not sure this actually resolves the proposal.
I don't intend this PR to resolve the linked proposal, which is why it doesn't say "closes" before the PR link. However, I believe this feature is still needed for artistic control (and it can help somewhat if you encounter the sky occlusion situation).
I agree. I would have it merge since it gives control over the reflections.
In order to fix the underline issue, how complicated is to capture another sky reflection but with the geometry oclussion instead of using the whole sky box?
In order to fix the underline issue, how complicated is to capture another sky reflection but with the geometry oclussion instead of using the whole sky box?
As mentioned in clayjohn's comment, you need to store a depth cubemap along the color cubemap (or perhaps store it in the cubemap's alpha channel so that no separate texture is needed). This will require slightly more time to update the cubemap but it should allow for properly occluding the sky.
This may also allow for improving parallax-corrected cubemaps with something similar to parallax occlusion mapping, as seen in God of War Ragnarok's fidelity mode.
This will require slightly more time to update the cubemap but it should allow for properly occluding the sky.
I don't mind that requires more time. In the future, cubmaps should be baked in editor unless they are move or updated always
As mentioned in clayjohn's comment, you need to store a depth cubemap along the color cubemap (or perhaps store it in the cubemap's alpha channel so that no separate texture is needed).
Completely disabling blending when fade start is 1.0 might also work, I think
In testing this definitely doesn't solve that proposal (that's not really news though). Multiple exterior probes in an interior with fade at 1 creates too many artifacts at the boundaries, and setting these probes to Interior nullifies exterior reflections. This is a great setting to have though, and alongside probe prioritization + depth cubemaps + custom per-probe resolution would improve reflection probes considerably.
Exterior Reflection probe, fade at 0.5:
Exterior reflection probe, fade at 1:
Interior reflection probe. Exterior reflections are far less present:
One exterior reflection probe for the bar, intersecting with the exterior reflection probe for the room. Both have a fade at 1. This artifact on the wood is too obvious and both probes would need to be interior instead:
Couple important things I've noticed:
- There seems to be some frustum culling of selected reflection probes in this PR. The borders and handles were disappearing at certain angles for me. This is very apparent in the Unreal Sun Temple, and doesn't happen in 4.2 Beta 2.
- This property is very difficult to edit and see its effects when the reflection probe's bounds are represented by a near-opaque green border. I might need to open a proposal to change this to something less visually obscuring.
UPDATE: Proposal to change the probe bounds HERE.
Definitely probe prioritization and depth cubemaps should be a must to have acuarte results. @clayjohn can you write a propsal (or comment in the OP proposal) about depth cubemaps since you know better what should be done?
Is this PR dead? I'm a little worried considering that this (OR the depth cubemaps solution) is pretty important to have.
Is this PR dead? I'm a little worried considering that this (OR the depth cubemaps solution) is pretty important to have.
Unfortunately since the Godot project does not have individual task prioritization or a comprehensive public-facing roadmap we have no idea. I have pushed for both in the past for this very reason. It doesn't matter how in-demand a feature is: either a core team member has to be interested enough to do it or an external contributor needs to come along and implement it themselves. In the case of the latter, there's a chance it could be stuck in yet-to-be-merged limbo for a while.
I also consider this an important feature and as of right now, reflection probes aren't useful for mixed exterior/interior spaces.
Rebased and tested again, it works as expected. I've implemented the feature in Compatibility as well, following https://github.com/godotengine/godot/pull/88056.
BOOYAH! This will probably get marked as off topic, but I'm so glad this is not dead, considering how essential of a feature this is. I hope this is getting cherry picked once its done?
I hope this is getting cherry picked once its done?
As per the release policy, new features are not cherry-picked to previous releases to minimize the risk of regressions.
Please test this on more complex scenes to check if the proposed default value is actually a good idea. It may be a bit too aggressive; perhaps 0.2 would be a better fit.
I would argue for the opposite, a higher default value makes more sense. Especially with the context of the probe priority PR (#89408).
Generally you'd want whatever is within the volume of a probe to be able to fully rely on that probe by default, and just want a bit of blending towards the probe borders to avoid a sudden obvious change. Since probe workflows very commonly involve having nested probes (for which we need probe priority), a small fade start would introduce a lot of duplicated reflections. A default factor of 0.5 means half of the area covered by the probe experiences those double reflections, which is essentially leakage from other probes, this is definitely something we'd want to minimize by default.
I tried to demonstrate this in a test project, it is not an ideal demonstration due to probe prioritization not being implemented yet, however it shows the effect that would happen on these transition areas between probes:
-> A single window turns into three reflections. (The way these probes are set up would obviously not be ideal even with probe prioritization, however it does the job of showcasing the issue) You can also see this effect on Suzannes head, where you can easily spot duplicates. This would happen on all transition areas. A low value of 0.2 would mean these would be very prevalent.
I also wanted to note that "band" of brighter reflections along the transition area is caused by the skylight getting blended in. This band should not be there once we have priority blending.
Something like 0.75 seems like a more appropriate default value to me: You get a bit of blending at the borders as a smooth transition into the probe, and the majority of objects covered by that probe will receive clean (i.e. not double or blended) reflections.
I do think part of the reason it might feel too aggressive is because for the ambient light from probes these higher values are in fact too aggressive as a default. I think it could be worth considering having a separate fade value for the ambient light, since ambient light is a much lower frequency effect compared to reflections. This would allow great artistic control of minimizing visible seams between nested probes (especially probes placed for detailing) where you'd still want the probe to take over reflections quickly (i.e. high-fade start), but want the ambient light influence to remain subtle and blend well with the "parent" probe.
Lastly, I think it could make sense to rename and re contextualize this property. Fade start makes sense as a property name when you look at what happens under the hood, but I think from an artists POV it would be a more intuitive experience if 0 means no blending (sharp edge), and increasing this parameter increases this blending distance from the edge of the probe. The property could be name "blending" (Or reflection blending, ambient blending)
Besides these things I've brought up: the behavior of the fade start works mostly as expected, though having non-cubic probes means there are inconsistencies with blending distances on the various sides of the probe. I could imagine this be an issue for things like alleyways, corridors, etc.
Shown here using a custom ambient color on a probe:
I don't think this is that big of a deal, and it shouldn't prevent this from being merged in the case that this is difficult to fix, but it is definitely something to be aware of.
Lastly, I think it could make sense to rename and re contextualize this property. Fade start makes sense as a property name when you look at what happens under the hood, but I think from an artists POV it would be a more intuitive experience if 0 means no blending (sharp edge), and increasing this parameter increases this blending distance from the edge of the probe. The property could be name "blending" (Or reflection blending, ambient blending)
I believe the concept of Fade Start is used in others places in Godot? Namely the distance fade option in lights, so maybe the name is approriate. But yeah, I'm pretty sure the expectation of someone using reflection probes is for the probe to be the main source of reflected light on objects inside its bounds. a very tight default fade start would make sense. (Not sure if ambient light distance should be separate, I don't imagine any reason to want different values for those)