X Tutup
Skip to content

Overhaul and optimize Glow in the mobile renderer#110077

Merged
Repiteo merged 1 commit intogodotengine:masterfrom
clayjohn:mobile-glow
Oct 31, 2025
Merged

Overhaul and optimize Glow in the mobile renderer#110077
Repiteo merged 1 commit intogodotengine:masterfrom
clayjohn:mobile-glow

Conversation

@clayjohn
Copy link
Member

@clayjohn clayjohn commented Aug 29, 2025

Depends on #109971

Fixes: #98531

TLDR

This PR overhauls our approach to glow to use something that is both higher quality and more suitable for mobile devices. On the tested devices the performance improvement is upwards of 2X on all tested devices and reaches over 7X on one device.

Notes

The way glow works in master is first, we downsample and blur the screen using a two pass guassian blur. Using 2 passes allows us to take kernel_size * 2 samples instead of kernel_size * kernal_size. Then, in the tonemap shader, we gather all the glow levels (each mip level of the texture), multiply them by their level amount and add them together.

There are three bad things about this approach:

  1. The number of render passes is 2 * the number of levels (this comes with a huge performance penalty on Mali devices and Apple devices)
  2. The tonemap shader does up to 7 texture fetches for each pixel in the screen
  3. Despite glow being a relatively low frequency effect, and the first couple of levels are so sharp you can't really even notice them, yet they are by far the most expensive.

Profiling showed that texture reads were the biggest problem for glow. Most of those texture reads come from the tonemap pass. When using all 7 levels we do 7 texture reads per pixel in the tonemap pass and 6.6 texture reads per pixel during downsampling. If we eliminate the first level and skip to level 2, then we can bring that down to 1.6 texture reads per pixel during downsampling. That's a nice improvement, but it still leaves 8.6 samples per pixel because of the gather. Accordingly, we need to somehow move the gather into a lower resolution pass so we reduce the number of samples taken at full res.

In the end, I prioritized reducing texture reads over reducing passes. I use the technique described in https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf with a few key optimizations.

Broadly, the technique downsamples in a single pass using an optimized blur that is somewhere between a box blur and a gaussian blur. It relies on the fact that repeated applications of a box blur add up to a guassian blur. What we do is downsample with the blur to our target level, then we upsample back up to full res, adding our original blurred textures in as we go. This takes 2 * levels -1 number of render passes, but allows us to do the gather as we upsample. So all the gather texture reads are done at low res. This massively reduces the sample count per pixel. With 7 levels using this technique we do only one sample in the tonemap shader and we do 3.0 samples per pixel during the downsample and upsample passes combined for a total of 4 samples per pixel.

I then also did a few other optimizations:

  1. Split the tonemap shader into one for Forward+ and one for Mobile. The one for Mobile is simplified and uses specialization constants to removed unused features. This significantly improved the speed of the tonemap pass. Even when not using Glow
  2. We use quarter-res for level 1 instead of half res. This cuts the number of samples per pixel down to 1.75. Moving level 1 to quarter res also had the side-effect of making the blur radius consistent with the Forward+ renderer despite using a smaller radius blur.
  3. We can skip sampling the original texture when the glow level for that level is 0. We still need to do the upsample and downsample passes to keep the size and quality of the blur consistent.
  4. Use the super optimized blur kernels from https://www.shadertoy.com/view/mdsyDf. This minimizes the number of texture samples we use. As a follow up, we could consider using less-optimized kernels to get better quality on desktop devices. That shadertoy includes a few options including the ones from https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf and Call of Duty

Quality

Forward+
Screenshot from 2025-09-01 14-30-07

Mobile: Before
Screenshot from 2025-09-01 14-32-25

Mobile: After
Screenshot from 2025-09-01 18-50-59

Performance

The performance of each depends in part on the screen resolution

Adreno 640 (1080 x 2280)

Glow default level 3 only all levels
Before 2.6ms 2.6ms 3.2ms
After 1.35ms 1.3ms 1.4ms
Tonemap
Before 7.4ms 6.7ms 8.8ms
After 1.5ms 1.5ms 1.5ms
Total 3.5X 3.3X 4.1X

Mali G710 (1080 x 2400)

Weirdly the Mali G710 is a much more powerful device (Pixel 7 vs Pixel 4). But the Adreno 640 wins here because Adreno devices can basically turn off TBDR rendering and go fully immediate mode for workloads like this.

Glow default level 3 only all levels
Before 3.8ms 3.2ms 4.2ms
After 1.75ms 1.3ms 2.25ms
Tonemap
Before 3.5ms 3.2ms 4.4ms
After 1.6ms 1.3ms 1.9ms
Total 2.2X 2.46X 2.1X

As you can see, performance on Mali devices scales very closely with the number of render passes used.

Adreno 530 (1080 x 1920)

Glow default level 3 only all levels
Before 3.5ms 3.45ms 3.6ms
After 1.15ms 1.1ms 1.23ms
Tonemap
Before 6.0ms 5.7ms 9.25ms
After 2.3ms 2.25ms 2.2ms
Total 2.75X 2.73X 3.75X

Intel Xe graphics (1152 x 648)

Before (all levels, glow): 0.24 ms
Before (all levels, tonemap): 0.5 ms
Before (glow off, tonemap only): 0.19 ms

After (all levels, glow): 0.13 ms
After (all levels, tonemap: 0.14 ms
After (glow off, tonemap only): 0.12 ms

Forward+ (all levels, glow): 0.4 ms
Forward+ (all levels, tonemap): 0.45 ms

I'm surprised to see such a big win here!

M2 MBP (2400 x 1366 + 2.0x scale_3d)

Glow default level 3 only all levels
Before 4.0ms 2.4ms 4.1ms
After 0.49ms 0.42ms 0.55ms
Tonemap
Before 1.58ms 1.26ms 3.15ms
After 0.47ms 0.41ms 0.44ms
Total 5.8X 4.4X 7.32X

Note, the timings for glow were pretty variable and could swing by about 50% between runs. I tried to take the worst runs from the after and the best runs from before to keep things fair. In any case, the new code is consistently an order of magnitude faster while the tonemapping code is more like 3x faster.

TODO

  • Clean up some code (Mip1 downsample is no longer used)
  • Further test the MIP2 downsampling
  • Do one final hail mary test to see if I can drop the cost on Mali
  • Test on more devices (iphone, macos especially since they are TBDR + high end GPU)

Notes

Using the sampling functions from https://www.shadertoy.com/view/mdsyDf
Using the technique from https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf

Next Steps

In another PR, we can copy this approach for both the compatibility renderer and the Forward+ renderer. The compatibility renderer approach is already based on https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf, but we can optimize it a lot more

@clayjohn clayjohn changed the title Mobile glow Overhaul and optimize Glow in the mobile renderer Aug 29, 2025
@clayjohn clayjohn added this to the 4.6 milestone Aug 29, 2025
@clayjohn clayjohn force-pushed the mobile-glow branch 2 times, most recently from bc3cef7 to e5adc89 Compare September 1, 2025 23:41
@clayjohn clayjohn marked this pull request as ready for review September 2, 2025 00:33
@clayjohn clayjohn requested a review from a team as a code owner September 2, 2025 00:33
Copy link
Contributor

@beicause beicause left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tonemap.glsl and tonemap_mobile.glsl seem to have many duplicate code. Should there be a tonemap_inc.glsl? which can make it easier for other PRs (like #106940) to rebase.

@clayjohn
Copy link
Member Author

clayjohn commented Sep 2, 2025

tonemap.glsl and tonemap_mobile.glsl seem to have many duplicate code. Should there be a tonemap_inc.glsl? which can make it easier for other PRs (like #106940) to rebase.

No, I intentionally duplicated the code since I expect these shaders to diverge even more as time goes on. Trying to share code between them is what led us to leaving a huge amount of performance on the table. This is a case where having optimized code for each platform is worthwhile and saves us literally milliseconds per frame.

@allenwp
Copy link
Contributor

allenwp commented Sep 3, 2025

tonemap.glsl and tonemap_mobile.glsl seem to have many duplicate code. Should there be a tonemap_inc.glsl? which can make it easier for other PRs (like #106940) to rebase.

No, I intentionally duplicated the code since I expect these shaders to diverge even more as time goes on. Trying to share code between them is what led us to leaving a huge amount of performance on the table. This is a case where having optimized code for each platform is worthwhile and saves us literally milliseconds per frame.

Why aren't specialization constants an option for this case? I suspect that specialization constants will be added at some point in the near future anyway to address performance issues from branching, even if we are using two entirely separate shaders. (In the past, I've seen a measurable performance gain when using the Linear tonemapper from simply turning:

	if (params.tonemapper == TONEMAPPER_LINEAR) {
		return color;
	} else if (params.tonemapper == TONEMAPPER_REINHARD) {
		return tonemap_reinhard(max(vec3(0.0f), color), white);
	} else if (params.tonemapper == TONEMAPPER_FILMIC) {
		return tonemap_filmic(max(vec3(0.0f), color), white);
	} else if (params.tonemapper == TONEMAPPER_ACES) {
		return tonemap_aces(max(vec3(0.0f), color), white);
	} else { // TONEMAPPER_AGX
		return tonemap_agx(color);
	}

into:

		return color;

(which is exactly how this would compile with specialization constants, if I understand correctly)

Copy link
Member

@Calinou Calinou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested locally, it works as expected.

I noticed an issue with 3D resolution scaling on macOS + Metal (or MoltenVK) though. The glow buffer doesn't appear to be scaled, so it will appear at the wrong position if the resolution scale isn't 1.0. Note that this issue does not occur if using MetalFX Spatial, only with Bilinear (FSR 1.0 isn't supported on Mobile).

Testing project: test_glow_mobile.zip

Scale 0.25 Scale 1.0 Scale 2.0
1 2 3

Scale 0.25 with MetalFX Spatial (looks correct):

4

@allenwp
Copy link
Contributor

allenwp commented Sep 19, 2025

tonemap.glsl and tonemap_mobile.glsl seem to have many duplicate code. Should there be a tonemap_inc.glsl? which can make it easier for other PRs (like #106940) to rebase.

No, I intentionally duplicated the code since I expect these shaders to diverge even more as time goes on. Trying to share code between them is what led us to leaving a huge amount of performance on the table. This is a case where having optimized code for each platform is worthwhile and saves us literally milliseconds per frame.

Why aren't specialization constants an option for this case?

Whoops, I hadn't looked into this PR thoroughly enough: I see now that specialization constants were added AND tonemap.glsl was split into two.

I presume there's a substantial reason that specialization constants weren't an option for optimizations that prompted splitting tonemap.glsl into two files?

@allenwp
Copy link
Contributor

allenwp commented Sep 29, 2025

With the Mobile renderer, the first level seems to add a lot of jaggies. This is especially the case with HDR 2D enabled:

Settings Image
image image

MRP: glow-test.zip

@allenwp
Copy link
Contributor

allenwp commented Sep 30, 2025

I'm struggling to review the code changes of this PR because I'm unfamiliar with both the existing and new glow gathering code. This is a "me" problem and not a problem with this PR.

...But I mention it, because it leads me to some thoughts that I figure are worth mentioning just in case it's helpful:

This PR seems to be a combination of:

  • Swapping out the Mobile glow gather implementation and changing how the rendering passes work in relation to this
  • Separating tonemap.glsl into two files
  • Adding specialization constants

This is pie-in-the-sky thinking, but an alternative approach may be to add specialization constants to the tonemap process in a separate PR. This PR could explore specialization constants for both Forward+ and Mobile on different mobile and desktop hardware.

There is also a part of the Godot PR process that I struggle with in general: although a single commit is best for merging, it makes things harder to review for a person not very familiar with the code when a PR combines multiple changes, like this one.

Anyway, not sure if my thoughts are helpful. I understand people only have so much time to work on these things and there is some efficiency to be gained in the development process by bulking multiple changes into one commit. I'm not sure if the extra complexity during the review process balances that or if there is risk introduced by bugs that couldn't be caught during review due to the extra complexity of the single commit during the review process. (This is likely a discussion that is beyond this PR?)

@allenwp
Copy link
Contributor

allenwp commented Sep 30, 2025

Oh! I've been so focused on finding any outstanding issues that I failed to voice my positive thoughts about this PR:

  • Changes the way that glow is gathered and passes are handled on Mobile to minimize texture reads and greatly improve performance on devices that can't read these textures quickly: 👍👍😄😄
  • Adds specialization constants to resolve issues with insane amounts of branching that saturates ALUs: 👍👍😄😄

These changes in this PR are extremely valuable and I'm really looking forward to having these merged in! It will be a game changer in performance on mobile!

@allenwp
Copy link
Contributor

allenwp commented Oct 10, 2025

With the Mobile renderer, the first level seems to add a lot of jaggies. This is especially the case with HDR 2D enabled

MRP: glow-test.zip

What do people think of getting rid of Level 1 for Mobile and Forward+ altogether? Even if it's not as expensive on desktop GPUs, I suspect it still has a cost that almost nobody benefits from?

Just spit-balling ideas here. Other than this, I'm not sure how this issue can be addressed...

@allenwp
Copy link
Contributor

allenwp commented Oct 10, 2025

Here's a quick comparison of this PR with Godot 4.5 for all levels, 1 through 7:

Mobile HDR 2D (this PR) Mobile HDR 2D (4.5) Forward+ HDR 2D (4.5)
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
mobile-hdr2d 4.5_mobile-hdr2d 4.5_forward-hdr2d
Mobile (this PR) Mobile (4.5) Forward+ (4.5)
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward
mobile 4.5_mobile 4.5_forward

* Note: #110671 will help fix some of the issues shown when HDR 2D is disabled.

The tool is fully automated, so it's easy to generate more images. Takes no time at all to try other configurations, just ask if you want to see.

This test does highlight that level 1 is the only regression in this PR...

@clayjohn
Copy link
Member Author

This test does highlight that level 1 is the only regression in this PR...

I don't intend to make any improvements to glow level 1. I searched Godot projects on Github and couldn't find any that relied on level 1. In practice it is kind of useless because the kernel is so narrow that it doesn't look like anything. Ironically level 1 is the most expensive to compute because it is reading from the highest res source, and writing out the highest number of pixels.

What this PR does to avoid that cost is simply downsample instead of blur level 1. So what you are comparing is a raw downsampled image to one that has already had an expensive layer of blur applied. They are not intended to match at all

@allenwp
Copy link
Contributor

allenwp commented Oct 14, 2025

What this PR does to avoid that cost is simply downsample instead of blur level 1. So what you are comparing is a raw downsampled image to one that has already had an expensive layer of blur applied. They are not intended to match at all

This makes sense and matches my understanding.

This is why I suggested we maybe remove level 1 entirely, since it adds jaggies and doesn't work as expected. To do this, I guess we could hide level 1 in the editor and force its intensity to always 0.0, even if a script tries to set it to something else?

My thought is that if level 1 is left in this state, it will both appear as a bug and also introduce risk of games being made to look worse if upgraded from a previous version that uses level 1 in the blur effect.

There is also a possibility that in some scenes it looks acceptable, but other scenes show the jaggies... So glow is made more difficult to use because jaggies might appear in scenes other than the one the glow was initially configured for. An example is when you have rectangular, axis-aligned objects in your setup scene that only rotate off axis in other scenes.

(Said differently, I'm concerned that this level 1 behaviour produces a bad user experience.)

@clayjohn
Copy link
Member Author

This is why I suggested we maybe remove level 1 entirely, since it adds jaggies and doesn't work as expected. To do this, I guess we could hide level 1 in the editor and force its intensity to always 0.0, even if a script tries to set it to something else?

I have no problem doing that!

@allenwp
Copy link
Contributor

allenwp commented Oct 14, 2025

This is why I suggested we maybe remove level 1 entirely, since it adds jaggies and doesn't work as expected. To do this, I guess we could hide level 1 in the editor and force its intensity to always 0.0, even if a script tries to set it to something else?

I have no problem doing that!

Let's go with that approach then! One other wrinkle is how the "normalize" function works: level 1 should not contribute to the calculation of normalized levels, in case it's been set through script or by a resource that was saved with an earlier version of Godot. I think that should handle all the edge cases to make this a good user experience...

@Repiteo Repiteo merged commit 3c1e479 into godotengine:master Oct 31, 2025
20 checks passed
@Repiteo
Copy link
Contributor

Repiteo commented Oct 31, 2025

Thanks!

Rudra-ravi pushed a commit to Rudra-ravi/godot that referenced this pull request Nov 6, 2025
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
Rudra-ravi pushed a commit to Rudra-ravi/godot that referenced this pull request Nov 7, 2025
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
@dsnopek
Copy link
Contributor

dsnopek commented Nov 13, 2025

I just finished bisecting and it looks like this PR broke foveated rendering with OpenXR and the Vulkan Mobile renderer. The project I'm testing doesn't have glow enabled, so it's probably some random collateral damage, although, from looking at the diff I'm not entirely sure the cause yet

@clayjohn clayjohn deleted the mobile-glow branch November 13, 2025 19:54
@clayjohn
Copy link
Member Author

@dsnopek Could it be a hardcoded framebuffer format somewhere?

@mmMarzban
Copy link

No difference for me. Still a poor performance on mobile.

@allenwp
Copy link
Contributor

allenwp commented Nov 14, 2025

But more importantly, if you look at it overlaid on actual game content with multiple layers the difference is much more apparent. The jaggies line up better with the underlying geometry and blend into the other layers better. On larger geometry its not even noticeable at reasonable settings.

Ah, I think I might have misunderstood the change that happened between the Oct 10 and Oct 24 versions of this PR. The change that was made was to do with how level 1 was blended with the rest and not to do with the generation of the level 1 texture?

If you swap between your images you can see a huge difference!

This is the part where I think the misunderstanding presented itself, as there is only a minor difference between the two versions of the PR:

Mobile (this PR Oct 10) Mobile (this PR Oct 24)
mobile image

Yanxiyimengya pushed a commit to Yanxiyimengya/godot that referenced this pull request Nov 15, 2025
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
@allenwp
Copy link
Contributor

allenwp commented Nov 26, 2025

But more importantly, if you look at it overlaid on actual game content with multiple layers the difference is much more apparent. The jaggies line up better with the underlying geometry and blend into the other layers better. On larger geometry its not even noticeable at reasonable settings.

Ah, I think I might have misunderstood the change that happened between the Oct 10 and Oct 24 versions of this PR. The change that was made was to do with how level 1 was blended with the rest and not to do with the generation of the level 1 texture?

Cleared this up in the rendering meeting: it was the change of threshold default that was supposed to help with some scenes' jaggies, but this change of default has been reverted so we're back where we started with jaggies generated from level 1.

clayjohn and I both don't have strong feelings regarding the behaviour of level 0 after this PR, so we're leaving it as-is and see if people report it as a serious usability issue.

ettiSurreal pushed a commit to ettiSurreal/godot that referenced this pull request Dec 1, 2025
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
Synzorasize pushed a commit to Synzorasize/godot that referenced this pull request Dec 20, 2025
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469

tonemap_mobile.shader_version = tonemap_mobile.shader.version_create();

for (int i = 0; i < TONEMAP_MODE_MAX; i++) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (int i = 0; i < TONEMAP_MODE_MAX; i++) {
for (int i = 0; i < TONEMAP_MOBILE_MODE_MAX; i++) {

Currently not critical, but should be adjusted at some point (enum TonemapMode and enum TonemapModeMobile currently have 8 values)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Indeed this works fine, but only by chance. If either enum changes it might break

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was actually corrected in #114149

AyyZerrAsa pushed a commit to AyyZerrAsa/godot that referenced this pull request Jan 4, 2026
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
xuhuisheng pushed a commit to xuhuisheng/godot that referenced this pull request Jan 31, 2026
Reverts the default value of Environment.glow_hdr_threshold from 0.0
back to 1.0 to restore the expected glow appearance in existing projects.

The default was inadvertently changed from 1.0 to 0.0 in PR godotengine#110077,
which caused glow effects to render dramatically different across all
rendering methods (Forward+, Mobile, and GL Compatibility). This broke
backward compatibility with existing projects like the Kenney 3D
Platformer starter kit.

Changed files:
- scene/resources/environment.h
- servers/rendering/storage/environment_storage.h
- drivers/gles3/effects/glow.h
- drivers/gles3/rasterizer_scene_gles3.cpp
- doc/classes/Environment.xml

Setting the value back to 1.0 aligns with documented recommendations
and restores visual consistency.

Fixes godotengine#112469
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

Glow extremely Slow with Mobile on Android
X Tutup