Allow developers to customize light attenuation

As a Roblox developer, it’s currently too difficult to simulate realistic light emitters without the ability to modify the emitter’s attenuation distance.

In real life, light begins to lose its intensity the further it travels from its source - this is called attenuation. Currently, it appears the engine has a fixed roll-off distance for lights. Lights could be much more versatile if developers could adjust this behavior.

In this example, both emitters have nearly identical brightness and range - but the attenuation light has a much more gradual brightness roll-off when compared to the current default lights.

The potential applications of this feature would be broad, including realistic flashlights, room lighting, or any light that a developer wishes to make photorealistic.


Currently, an approximation of the above effect is possible using multiple emitters - however, this is not performant at scale. If engineers were to address this missing functionality, developers could easily customize each light to fit their needs.

To preserve backwards compatibility with existing experiences, this could potentially be a property similar to Unreal Engine’s Attenuation Radius - developers could modify a Attenuation property for each emitter [perhaps a range of 0-1]

In 2016, @zeuxcg mentioned variable attenuation during his lighting Hackweek project (the early prototype of Future Lighting). Many of the above points have since been addressed. However, customizable attenuation remains missing.

62 Likes

Honestly I’d be perfectly happy with this just being forcefully enabled one day if it means that large lights won’t look as awful as they currently do.

5 Likes

I think this would be a really good change, lights look very weird on their own. You can get good results with multiple lights but its a lot of work for something that should just be in the engine by default.

2 Likes

This would be really good feature, achieving photorealistic lighting is difficult with awfully low light range and no way to control attenuation. I have experienced this issue with my friends a lot of times and its really bugging me out.
If Godot, Unity, UE have this, why can’t Roblox have it? We’re not in 2015 anymore, this is 2023.

7 Likes

This. And being unable to set the range greater than 60. It would be nice if it was a number sequence as well.

It would be one step in the right direction for Roblox to move towards the current game engine standard. Graphics are important in every game. Control over them gives the developer more ways of expression.

10 Likes

I am all for this, but considering they aren’t increasing the maximum range for lights, I’m doubting they’ll do anything about this.

1 Like

On the relevant feature request for this issue, an engineer mentioned that staff were investigating solutions for implementing a higher range limit for lights. Hopefully we see this limitation changed soon.

In the case of light attenuation, I’m hoping that this ticket is filed internally - perhaps a lighting update sometime in the future will include this and the above issue. :eyes:

2 Likes

In Blender, this feature is called ‘Blend’ and works like a mask feather. I find that the lights on Roblox are currently too limited to make aesthetically pleasing and physically accurate light sources without using tricks like OP mentioned (multiple lights).

I’d love to see this become a feature and allow developers to improve the visual quality of their scenes. Lighting is an important pillar that keeps visual quality up high.

4 Likes

this would be extremely useful for making ambient light as i could make lights extremely soft without having the middle part be annoyingly bright also useful for lamps and literally any other kind of light

1 Like

Bump! This would be insane as of 2023, this is something we REALLY need! It would make achieving incredible lighting so much easier for everyone! :+1:

Today I decided to look into Roblox’s shaders, thanks to Vulkan and NVIDA Nsights Graphics I was able to decompile and modify shaders mid runtime, letting me modify the lighting for point lights.

Now what I have found is that Roblox already does use inverse square root for the light fall off, however this square root is so large, that it exceeds the lights radius. So what they did is that they clamped the light to not exceed the lights radius, then subtracted -1 which gives us that very ugly falloff.

I’m gonna continue and try to fix this, it’s a bit annoying because each material has its own fragment shader.

Here is an image from me trying it out for a test but it’s not great.
image

The left is the unmodified fragment shader of the smooth plastic material, the right is a modified fragment shader for the ceramic tiles material, I disabled specular lighting in this example because I had some *problems with it with it :grin: (funny broken specular lighting)


image

5 Likes

This will probably take a while because I don’t have access to the shader source files and I doubt roblox will ship them inside of the client ever again :sob: + I suck at GLSL so reading the code with hundreds of unnamed variables is not fun

I can see how Roblox’s backwards compatibility mindset has a role here… they can’t realistically change the engine default falloff without breaking a lot of game appearances.

Add a light falloff property to lights, literally just use the UI they use for UIGradients

2 Likes