A brightly-lit sky - at absolute maximum brightness that the texture can support - is outshined by a simple white part under almost all Roblox lighting setups.
I am sure the visual example would suffice as a complete demonstration of how ridiculous this is, but in the interest of completeness, I’ve chosen to at least write some more words about the issue.
The basic problem here is that skyboxes (specifically as implemented in Roblox) are completely non-physically-based.
Skyboxes are supposed to encode radiance from the surrounding environment. In other words, every pixel of the skybox is not just some RGB colour like you might assume - instead, it’s more like the colour that a PointLight emits. It’s conceptually unbounded in brightness and has a different brightness falloff compared to what’s used in textures (gamma for those who want to look into it).
Unfortunately, Roblox’s skyboxes are terrible at encoding the information they are, by almost all PBR definitions, supposed to be encoding.
The largest issue is that Roblox’s skyboxes are SDR. The maximum radiance that can be output by a skybox is (1.0, 1.0, 1.0).
Sounds bright? Under Roblox’s tone mapping, that only equates to (223, 223, 223) on-screen. That’s exactly equivalent to a Neon part with a measly (131, 131, 131) Color.
It’s not even bright enough to naturally bloom - and this is supposed to be the big bright light source taking up half of the screen!
The sky should be able to get much, much brighter than this. Here’s Blender with an actually-physically-sensible rendering of a skybox - look how the light naturally blooms around the object, because the sky is bright enough to make the virtual camera sensor bleed.
So, how is this done? Most commonly; using HDR textures. HDR textures allow the red, green and blue parts of an image to go as high or as low as needed, by setting aside a few more bits per colour channel. They are more memory intensive, and so are definitely not something to be slathered everywhere possible. However, for this use case, it’s incredibly difficult to achieve this good of a result without the proper range of brightnesses available.
If Roblox can make HDR textures work for skyboxes, they absolutely should, and absolutely soon. This is a massive glaring flaw in the lighting model!
Now, it’s entirely possible that this would cause an unacceptable increase in download sizes, or perhaps it wouldn’t fit neatly in texture buffers across different hardware. So, there are also ways of making SDR skybox textures less, well, terrible.
Primarily, what I would want to see as a lighting designer is brightness. Much as you would the Brightness
on a SurfaceGui
, you should be able to modulate the Brightness
of the skybox so that you can hit higher brightnesses. You won’t get the full HDR effect of truly bright objects, but it’ll at least help lift your sunlight up above the world’s brightness.
An important secondary property that goes hand-in-hand would be contrast - pulling up the brightness of highlights should not be at the expense of the darkness of shadows. There are often dramatic contrasts in skyboxes between darker land and brighter sky, which needs to be preserved for the skybox to look good. So, where brightness lets you modulate the overall brightness, contrast should let you increase the brightness difference between highlights and shadows, so that they stay in the appropriate parts of the spectrum.
The only mechanism we have today to adjust the brightness of the skybox is ExposureCompensation
. For any decent effect, you usually need to push it up to 1.5 or higher, which looks like this when you adjust some other lighting settings. Remember, this is the maximum brightness of this sky, looking directly at the sun.
So, what’s the problem with this? There’s two large ones:
- As you increase
ExposureCompensation
, you start running into colour fringing in lighting details, and generally the precision of colours is demolished, because Roblox processes most lighting with limited precision, and this is stretching out the limited precision over a larger range of brightnesses. - This is a global parameter, requiring whole-game adjustments. You can try and auto-adjust for this if you write a lot of code to handle every single case, but especially with more modern technology like clouds, there’s pretty lame adjustability and usually you’ll just have to stomach a fundamentally different look.
This is completely untenable for lighting artists or asset pack creators who can’t usually waltz into a project, make them change all their assets, and demolish the quality of all of their smoothly coloured assets in the process, so I think it would be safe to describe this workaround as a non-starter for most people.
So, to conclude: HDR textures for skies are sorely missing, and we need control over sky brightness independent of global parameters. I have faith that this is possible and that it shouldn’t be hard to do, but I am somewhat amused that it didn’t exist yet.