Properties to control intensity of material diffuse, normal, and reflectance

As a Roblox developer, it is currently impossible to adjust the strength of individual maps of materials on parts.

If I could adjust the strength of material maps (diffuse, normal, reflection / metalness, roughness, normal), I would be able to simulate wetness and achieve other creative effects, hugely boosting the range of creative possibilities for me as a developer.

Users have also been asking for a way to control material intensity, but suggestions have been lackluster, insufficient, or neglect to mention what happens to anything other than diffuse. I need to be able to control each map separately to fully realize my creative visions.

Further, it is known that the reflectance property of BaseParts is legacy and will be superseded by PBR-driven reflections, so this would be a welcome replacement for its functionality.


Use cases:

For example, I’m planning a weather system in my game and I want objects to look wet during a rainfall event, but it is not possible for me to make certain things outside shiny to simulate the effect of them being wet from rain. The best I can do is throw in rain particle effects and adjust lighting and brightness and color correction to give the impression that it’s overcast outside. It is mostly impossible for me to make things appear wet. The same applies for characters who have just crawled out of the ocean; I cannot make them appear wet, which I think would be a great boost to immersion.




My experimental attempts always feel like they’re missing something until I add layers of glass to add reflectance to simulate things being wet, but this is not nice to do programatically. I want to tag key affected parts and apply a simple property transformation during weather events, not create thousands of temporary glass parts that don’t capture normal information in their reflections.

Further examples include making wood appear shiny as if varnished, or matte as if well-worn; or making metal less reflective on heavily used equipment, since you wouldn’t expect to see a shiny hammer, vice, or other heavily-used tool.

This could also be used to take existing materials and put a completely unusual spin on them, such as making ice or foil less reflective and using it as another stone texture; making fabric reflective and using it like some kind of slime; or making concrete appear more matte with a deeper texture and using it like cork or sponge. My game takes place on an alien world, and being limited to the current material palette (and the upcoming expanded material palette) without any way to innovate upon it or use it in creative new ways to push the “alien planet” narrative is very restrictive.


I want these mushroom-like plants to have slimy-looking ridged stems, but I have to settle for matte because I cannot control the reflectance of the sand material. This biome is lit by a lot of purple light, so if these plants were more reflective while keeping the ridged pattern of sand, I think it would look very alien and exciting.

image
Note the unrealistic reflection in the top right corner. Cork would not do this, but I would not be able to make this material behave better. Using texture instances is also undesirable due to z-sorting issues.

In addition to controlling intensity of reflectance and normal maps, the primary motivator for being able to control diffuse intensity is to make materials less intense or detailed to compliment different art styles. For example, fabric is extremely intense and dark, and would look better in certain situations if it could be toned down, (i.e. brighter black and white texture, or lower contrast). In the other direction, if I want to use concrete as sponge or cork, or sand like ruffled fabric, for bright colors it is necessary to make the diffuse more intense to make the usage of the material more believable.

Being able to adjust all of this would dramatically increase the range of possible reuse of built-in materials, which is something Roblox is currently considering while developing new materials.


What I’m asking for:

Ultimately the goal with diffuse is a reliable way to make details more or less intense, and I imagine the most versatile and artistically satisfying way to do that without affecting the part color or being redundant is to lift the darkest colors while keeping the brightest colors the same. This is so I can make textures softer or more aggressive to try and reuse materials for different purposes, or compliment softer colors and simplified art styles.

Similarly, the goal with normal is to be able to make details have more or less depth. This is so I can boost detail in environments meant to appear realistic or have steeper details, or tone down noisy normal maps in environments with simplified art styles.

Finally, the goal with reflectance is to be able to raise or lower the base level of reflectance. This is so I can simulate effects like wetness, varnish, slime, etc. while having the reflection also take into account normal maps.


Implementation:

The way I might expect this to be realized is through new BasePart properties to control the strength of material diffuse, normal, and reflectance maps, or whatever equivalent Roblox is or will be using. In the properties widget in Studio, I could expect this to behave like a number range or slider, range 0-2, default at 1.

These are what I find in the files, so these are what I am referencing now, but whatever Roblox uses internally or can expose to developers in a clean way is also acceptable.

explorer_2021-03-20_20-35-10

There are probably industry-standard ways to adjust normal intensity and reflectance that I do not know about. But generally, for reflectance I would expect this to increase the lowest reflectance (so non-reflective becomes reflective), and slightly increase the highest reflectance.

Something like Photoshop’s midtone level adjustment could be a good way to achieve an intensity adjustment for diffuse, since it gives a full range of adjustment in terms of value, and has nice results for both colored and greyscale diffuse:

I’m not sure if using this method for diffuse is infeasible, so also consider instead just a simple brightness shift, it’s probably also good enough.

I imagine that since developers can change the colors of BaseParts without performance implications, this too might be possible. (If it’s not, I would appreciate hearing the technical reasons why, I am very curious.)

51 Likes