Future Lighting needs to expose more "internal" hardcoded properties for light instances

Bump! This would be incredible to have as of the end of 2023 ngl. It would make things so much easier for younger developers to achieve incredible lighting within their games, it is currently still incredibly hard to get good lighting sorted using future is bright especially.

4 Likes

As a professional lighting designer who’s worked with all sorts of software, and as someone whose final dissertation at uni was about path traced light transport, I can tell you right now that half of this feature request is extremely hard to do. It’s not a question of “how much time/money/developers/experience/care” but technologically infeasible given the state of the art.

Engines like Unreal have completely depended on some very clever sleight of hand to achieve the visual fidelity that they do. It might look like it’s similar to Roblox but under the hood it is one of the greatest smoke-and-mirror tricks in all of computer graphics. The only tech that gets close to sufficing Roblox’s technical requirements is ray tracing, and you need beefy RTX cards to even handle that.

Lightmaps are never going to happen and it doesn’t matter that you don’t care. They are technologically obstinate, and are awful to work with. Full stop. Us lighting designers tolerate them because they are useful means to an end. Companies like Valve spend days rendering out lightmaps on massive server farms with dedicated hardware; if you think you’re going to unlock that sort of fidelity, you can forget about it. You’ll likely be left with noisy lightmaps generated on your laptop and denoised by some blobby mediocre algorithm. And it’ll all be at the sacrifice of dynamism and it will fall apart the moment you try and do anything else, especially in the absence of any probe lighting subsystem. The reason lighting designers care about real time ray tracing is not because it looks better - we are a crafty bunch and can hack our way to visual fidelity - but we prefer it instead because we can lay this archaic, unfriendly and technologically restrictive system to rest at last.

Elongated light sources would be nice, sure. But they’re also a completely different bucket of maths. The lighting engineers would have to completely rederive a whole host of formulae to allow light to propagate from linear sources like that, just as there are already unique formulations for point, spot, and area lights. And not just for Future lighting either, but also for voxel too. Not to mention how difficult it is to come up with good closed form solutions for shadowing and specular highlights. Area lights approximate this with a single depth projection placed behind the plane, and unrealistically clamp the highlight to originate from anywhere within the bounds of the light source rather than properly re-deriving the (more computationally expensive) accurate solution. While a similar trick for specular can be employed to half-heartedly fake the specular for linear lights, how exactly do you propose they approximate a depth projection smeared across a line? If you can’t answer that, how do you ever expect this to get implemented? And that’s before we even ponder the use case. Lasers? Ceiling lights? I’m not sure there’s an obvious case to be made that we need this when stacked up with the development cost.

And then there’s the small fry like shadow bias. What exactly do you intend to do with shadow bias of all things? Are you having severe light leaking problems? Does Roblox not provide workable contacts already? Or are you listing off features from more technically complex engines in the hopes that having more knobs and dials will somehow - somehow! - make your work look realistic, with zero understanding as to how you would even achieve that? Unless you’re trying to fit individual light bulbs into tiny lamp covers, I have no idea what on earth you are doing that shadow bias is your biggest limitation. And even beyond the limited set of niche cases where it might maybe be a problem, are there really zero solutions to this problem? If you have a lamp shade, just point two spots out the top and bottom. You don’t need shadow bias for that!

This post seems to come from an understandable place of wanting Roblox to have a more powerful and comprehensive lighting engine. However, it is also loosely informed and tenuously draws connections between this supposed lighting quality and features which are either intractable for Roblox’s fundamental design constraints, or which make zero meaningful contribution towards greater visual fidelity. Advocating for this sort of nonsensical set of requirements should be the domain of clueless shareholders at investor meetings, not developers.

So have a minimum level of faith that yes, maybe the rendering team are listening and they do want the same thing as you, that this is not stagnation but simply technological impossibility, and that they are delivering you a Herculean effort on a platter by being able to advance on this problem at all. If it were so simple as this post laid out, we would have ten thousand Unreal Engines.

16 Likes

How are these things any difficult if I may ask.

Especially this, its literally how the lights are coded, its just a request to let us change the hardcoded values for these.

3 Likes

It’s kind of a strawman argument to bring these up when they (Elttob) have argued something else. Nobody was saying these features are difficult to implement, but instead arguing about how the other ones you have not brought up in this specific reply are challenging specifically for Roblox to implement as a feature due to platform constraints they must enforce.

Also, I have to question requests like these. Are you sure many would even be able to use this feature? Would it be justifiable for them to give up so much control over core parts of the engine if few people would make use of them? Or would it be better if the engine automatically figured out the best atlas size instead of us developers having to worry about implementation details that they have nowhere stated are constant? It isn’t a difficult feature to implement as two simple properties into some Instance in game world, but it brings other problems along with it.


EDIT:

Because you specifically mention “more or less for the sun light”, it makes me think you are referring to ColorShift_Bottom. This does still exist and does still work, but it’s super broken on ShadowMap and Future lighting technologies:

Besides, it doesn’t affect shadows anyway, just how individual objects are shaded depending on which parts of them face the sun/moon.

2 Likes

Yes, some of these that you are pointing to constitute the other half of “half of this feature request that is hard to do”. Changing the resolution of a shadow map would not be an ordeal, which is why I chose my words the way that I did.

But since you asked for some elaboration, I will happily provide.

Not hard to implement, but artistically limited in use, and since it’s a property with no physically based interpretation, it’s a more serious forward compatibility hazard, especially for a more semantic engine such as Roblox.

As far as I can tell, this is similar to doing an alpha test (or perhaps sharpening an SDF) - this is not particularly expensive, however it seems like an odd option to have given that again, this is not physically-based, and also only has an interpretation for shadow-mapped lights while being completely incongruent with voxel rendering. All lights in the real world cast shadows with penumbrae, so I would only see this option being useful in more stylised applications, at which point I would prefer a proper styling engine rather than merely implementing a heap of atomic-sized hacks to get there.

Shadows don’t have colour in Roblox’s rendering engine. They are the absence of light. If you want coloured shadows, cast coloured light onto them. I’m not even sure what you’re trying to ask for here.

It would be nice to indicate to Roblox which lights should be prioritised, but absolute shadow map sizing is never going to happen. It would both cause too many easy footguns for developers, and it would lock Roblox into difficult decisions as hardware develops into the future. Hardware does not just ‘get better over time’, instead, it gets more varied over time. Phone hardware is far more spread out in graphics power right now, for example, and new platforms such as Meta Quest often change where the pressure points are in the graphics pipeline. For Roblox to expand to these new hardware configurations, it must always reserve the right to make decisions about how to relieve pressure in its graphics pipeline, so any properties along the line of ‘shadow map resolution’ are likely out the window. Instead, you should be asking for a way to suggest to Roblox which lights are your ‘hero lights’ versus which can be safely degraded - which come to think of it, isn’t that in large part what we use the shadow toggle for right now?

See above - optionality doesn’t solve those problems either, because when developers - not Roblox - have the option, it’s locking Roblox into awkward problems around hardware compatibility.

This is something I would like to see myself. IES profiles do wonders for realism. However, Roblox would also need to modulate light intensity with IES in voxel modes, which is another performance consideration. It sounds like it could be done. It’s probably one of the few proposals on this list I would consider ‘within the realms of what is realistically doable’.

Again, not physically based. Arguably, Roblox’s current voxel falloff is not physically based either - from my experiments, it looks more like inverse square root than inverse square, and that’s annoying. My take here is that Roblox should move everything to inverse square falloff (what they’re doing right now by the looks of the FFlags) and they should not expose this. Looking to the future, many ray tracing algorithms implicitly model inverse square falloff in a way that’s perhaps possible to compensate for, but by no means does it naturally ‘fall out’ of the system the same way it does with shadow mapping or voxelisation.

This seems realistic.

Why would Roblox decouple this from light source radius?

Again, why would this be decoupled? These are all facets of the same phenomenon - larger/area lights are softer.

I think one reason why Roblox mightn’t have introduced this is because they don’t have a good story for soft penumbra, which is perhaps the most significant part of this effect above how specular highlights look. Another reason might be that they don’t use closed-form solutions for area lights such as LTCs, which arguably has a much larger effect on the look of specular highlights.

What you’re asking for here are BRDF controls. This should not be a per-light setting, but rather an aspect of the materials themselves. The only semi-reasonable use case I can think of for having this be per-light is removing the specular component for artist-placed bounce lighting, which I think maybe has an outside chance of not being laughed out the room, but in such a rare circumstance, it would almost certainly be implemented semantically so as to not become a forward compatibility hazard.

I hope this is a satisfactory level of detail to justify what I wrote before.

8 Likes

Also I want to add up here, the feature request is meant explicitly for FUTURE. Voxel is not meant to get any upgrades. Its voxel after all and has its own unique style.

This needs to be per light, because sometimes you have invisible light sources creating incredibly ugly specular highlights that you do not want to have. Since they are forced to be a ball and cant be elongated or realistically show a complex light source.

Because its a different thing! Please look at the links and see what they actually do. It seems dumb to have yes, but for certain scenarios this is incredibly useful to have decoupled. I feel like having a compromise that by default they are coupled, but advanced users have the freedom to customize these.

Also, apologies if I sounded a bit passive aggressive, did not mean for it to come over that way.

1 Like

I wouldn’t agree here and it seems neither do Roblox - I want my lighting to appear consistently across all lighting engines so that I don’t have to author for two distinct looks. I want to design my lights once and have them gracefully degrade. Having voxel be a different ‘style’ just means artist intent isn’t preserved between them.

The reason I say that Roblox wouldn’t agree is that there are new FFlags indicating Roblox is actively unifying voxel and future by reworking the way light falls off, and the new GPU voxel engine they announced at RDC was also explicitly targeted at making the different lighting engines provides comparable output.

3 Likes

Im sorry, but voxel and per pixel lighting is 2 seperate lighting techniques. You cannot have it look similar on both. Choose one that fits for your game and not both.

Its like saying I want my stylized minecraft game that uses voxel lighting to look the same as my more realistic game that heavily uses PBR. They just simply dont work together.

If your genuinely relying on voxel being used as a lower end lighting technique for your game, thats dumb. Voxel has ruined my games multiple times (and even given people advantages because of how much more brighter voxel overall is) in darker areas to people on lower end.

The only thing that would work here, would be that future instead of falling back to ShadowMap on graphics levels lower than 4, would be something like the FIB prototype VoxelGPUCascaded. It still has specular highlights, smaller voxels but still wouldnt ruin the whole aspect of the game. So yes, if GPU based voxel lighting does end up being similar to that older system then I see no problem. But the current system is unusable.

2 Likes

… you’ve seen the RDC presentation… right?

3 Likes

Unrelated to the topic, but games should really provide the option for players to switch between the various lighting technologies that exist. For example, allow low-end players to use voxel over future lighting.

Yeah, sadly it seemed to lack specular lighting. I hope they add this back because that was a big point for me in VoxelGPUCascaded.

2 Likes

Update it has been added to the roadmap so it does seem like they are adding it.
image

1 Like

So much this. Not to mention the limitations that exist when you can’t ship static versions of your engine. It’s hard for the Roblox team to change anything, because we’ll inevitably have an outcry of people complaining about how it breaks old games.

Roblox’ greatest advantage is also it’s simplicity. The ease with which you can deploy your game and have it seamlessly work on all platforms is unparalleled. Yes Unreal and Unity can build to IOS or Android, but the amount of optimization and work that has to go into a mobile port there is still immense if you actually want to take advantage of some of their more complex features.

1 Like

I’d rather have to do more difficult work with a way wider set of tools for more performance and visual quality than having to work tiringly on finding hacky fixes because roblox cant add simple features.

Roblox is one of the only game engines that has to deal with so many moving parts and instances. 50 players for example, all in a waiting lobby WITH shadows all moving. Keep in mind how many parts are in an R15 model. Roblox has to update shadows and other lighting effects every frame for the entire viewport. Now combine that with more complex models, mesh, CSG and now PBR and custom materials/textures. Roblox can easily get bogged down.

Compared to other games which are well optimized since they are optimized specifically for that game, Roblox does a pretty good job for the vast swath of games that it supports.

I wish it was a bit more optimized but the system is designed to account for all sorts of objects and rendering every frame which will of course bog down the graphics card.

Then work in an engine tailored to your needs? I don’t understand. It makes no sense for Roblox to take their core product and turn it into something completely different, just to make a few developers happy. It’ll most likely lead to a worse product for the consumers in the end. Again, Roblox’ number one strength is it’s simplicity. The near-unified experience across different devices is a big part of that, and also something they’re trying to make even more unified, not less which this would do. .

Why should Roblox stay limited and far behind all other engines? Roblox is going to need better graphics, better customization, and most importantly better developers if they want to age up their platform, and last for the foreseeable future.

The reason games are so simplistic is because Roblox has horrible optimization for lower end devices, and two it’s extremely hard to make a modern looking game on Roblox due to Roblox’s limitations. If it was easier, there would be a lot less basic and simple games. Just Roblox can’t handle them lol.

4 Likes

Because they’re vastly different engines with vastly different aims. Like Roblox can’t really be compared to other engines, because it comes attached with a platform, and users who have the newest version of the engine installed.

I don’t think you actually understand what that means. With engines like Unreal and Unity, you ship a static version of the engine with your game. The game is built into an executable, and along with it, all your dependencies which includes the necessary parts of the engine. In Roblox’ case, the engine is not a part of your game, users and servers have the engine installed and always updated.This is a hugely important feature difference between Roblox and other engines. And again, a huuuge limitation for what exactly Roblox can do. People complain so insanely much whenever an update to studio breaks some feature in their games, but with other engines this is something that happens far more, and on a far bigger scale. The only reason it isn’t a gigantic problem, is because people can stay on old engine version. That would never work for Roblox as the whole appeal is streaming into games without having to download gigabytes of content first.

Some of the features that people want Roblox to have would require massive overhauls to systems, sometimes regularly. Which is unfortunately something the community doesn’t seem prepared to handle.

Why should Roblox stay limited and far behind all other engines?

I don’t even understand this? Roblox has always been behind other engines in terms of graphical fidelity and other things. It’s been part of it from the beginning. What you lose there, you gain on other fronts. Networking in Roblox isn’t the greatest, but it’s so delightfully simple compared to my experience with Unreal and especially Unity yuck.

The reason games are so simplistic is because Roblox has horrible optimization for lower end devices

I really don’t think it does.

it’s extremely hard to make a modern looking game on Roblox due to Roblox’s limitations.

This isn’t really the case, you can get pretty far with PBR materials and high quality assets, most people just don’t know how to create their own in the first place. Having access to superior lighting technology isn’t going to suddenly make you capable of using it well. But again, if your goal is to make a super realistic game, I’d say you’ve chosen the wrong engine to begin with. Why pick up a screwdriver and complain it doesn’t work well as a hammer?

If it was easier, there would be a lot less basic and simple games. Just Roblox can’t handle them lol.

No I’d say the primary reason there aren’t less basic and simple games, is because those are the exact games that do well. The majority of the playerbase is young and on their phones, they love things they can jump into quick and play with their friends. There’s been plenty of high quality games but most don’t perform anywhere near well enough to justify the amount of time, money, and work that has been put into them.

4 Likes

Well the feature request is asking for more control over existing systems, adding complete new behaviour is another thing, where it would be good to get an actual response by roblox staff, but existing systems? Why is there a problem to add a literal slider for a value that would be in their shaders? Why is it “complicated” to add a literal customizable light attenuation?

And like, it’s not a big think I’m asking for

Emissive Textures as an example don’t exist in this engine in 2024… GoldSrc from Half Life 1 in 1998 had emissive textures…

1 Like