Material Service Beta Updated with Per Part Custom Materials + More

Hello developers,

Last December, we announced our first step towards the next generation of materials in Roblox with the first beta of UGC Materials.

Material Service lets you create custom MaterialVariants to use with parts and terrain so that you can bring your own custom looks to the platform. We’ve been amazed at the response and how you’ve taken advantage of the system to create truly amazing experiences!

We’ve been listening to your feedback, and today we’re excited to release a significantly improved beta. In Beta 1, we allowed you to override the visual properties of existing materials. In Beta 2, we want you to make as many MaterialVariants as you want, apply them to specific parts or as overrides to built-in materials, and share them. We’re introducing five key new features to enable this expanded use:

  • Per-Part Custom Materials: Create now entirely new MaterialVariants that can be assigned to individual parts rather than only overriding the material for all parts.

  • Adaptive Materials: Models with per-part materials automatically adopt the custom materials from any place you insert the models into.

  • Unified Material Overrides for Part and Terrain: We’re simplifying our material system by allowing a single material to apply to both part and terrain overrides.

  • UGC Terrain Coloring: UGC terrain materials respect color tinting.

  • Ability to customize the look of all-terrain sides: The new TerrainDetail object lets you have different visuals for the sides and bottom of terrain instead of using the same visuals for all sides.

Let’s dive into detail.

Per-Part Custom Materials

In the first beta, we only allowed for “overrides.” For example, you could replace the built-in Brick material with a custom Brick, but every part using Brick would pick up your custom material. Now, in addition to overrides, you can specify a MaterialVariant per part. To do so:

  1. Add the variant in MaterialService as usual

  2. Set the Material of the part to the base material you want

  3. Use the new MaterialVariant property to specify a specific variant for this part.

The screenshot below shows three parts each with its own brick variant.

Adaptive Materials

We are trying to make materials flexible and useful, and as part of developing MaterialService, a question occurred to us: as developers adopt UGC materials and their experiences have different art styles, especially with per-part materials, could we some way make the materials adapt so that when you reuse a model across different places, it automatically adapts the place’s art style?

We’ve come up with a simple and elegant solution that we’re excited for you to try. When you specify a MaterialVariant on a part, we store the name of the variant. This makes it so that if you move a model across places, it looks for an active variant with the same name and base material and automatically binds to it. This lets models instantly adapt to the art style of the destination place.

Let’s consider an example. Imagine you have MyAnimePlace and MyRealisticPlace. In each of these, you have a Brick variant called MyBrick, but they look different: one has an anime style and one looks realistic. In MyAnimePlace, you create a brick house using MyBrick and save it to Roblox. When you insert your house into MyRealisticPlace, it’ll see there is an active MyBrick variant and automatically use it, making the house adopt this specific art style.

If you want your models to look exactly as intended, you will need to include the variant when sharing the model and copy the variant into MaterialService in the destination place. We will be adding an option when publishing models to simplify this process.

As an added feature of the work we had to do to enable Adaptive Materials, when you want to set a variant as an override, rather than having to explicitly specify it, you can simply name the variant the same as the built-in material you want to override (e.g., “Brick”) and by default, MaterialService will use it as an override.

API Changes to Support Per-Part and Adaptive Materials

To support these new features, we needed to change the MaterialService API. The prior API calls will be removed shortly. Here is the new API:

  1. MaterialService:SetBaseMaterialOverride(Enum.Material, string). This function sets an override with a specified MaterialVariant name.

  2. MaterialService:GetBaseMaterialOverride(Enum.Material). This function returns the current override MaterialVariant name for specified Material type.

  3. MaterialService:GetMaterialVariant(Enum.Material, string). This function returns a MaterialVariant object reference under MaterialService that has a matching BaseMaterial and Name. If more than one matching MaterialVariant exists, it returns a random result from the matches.

Unified Material Overrides for Part and Terrain

We heard your voices about wanting to create materials that are consistent between parts and terrain. In order to streamline the authoring process and solidify the concept of unified material, we combine the part and terrain overrides into one section: Material Overrides.

IMPORTANT: Because of this unification, any currently-set overrides will be lost. You have to set the overrides again.

UGC Terrain Coloring

We are happy to announce that Terrain MaterialColors are now applied to UGC Terrain. In addition, UGC terrain uses tint coloring–just like parts–instead of hue shifting. This allows you to create more consistent materials between parts and terrain. Soon, when we release an upgraded set of built-in materials, these will also use tinting, fully unifying material coloring.

Terrain Detail for Side Customization

We heard your feedback that you wanted more control over custom terrain materials, specifically that you wanted ways to set different visuals for each side (including top and bottom) rather than reusing one visual for all sides. TerrainDetail is the answer. Simply create a TerrainDetail object under the desired MaterialVariant, upload your textures, and specify which face it affects.

What’s Next?

While this is a major set of updates, there are still three major things yet to come:

Built-in Material Upgrade

We are soon releasing a switch on MaterialService that will let you opt-in to new, 2022 materials. These upgraded materials not only look great but are designed to more seamlessly work with UGC materials. They also introduce textures currently only available to the terrain as part textures.

Material Manager

While we are taking steps to make the current material workflow using Explorer and Properties smooth, we think the best way to manage materials is with a user-friendly, visual interface. We’ve been working on a new tool we call Material Manager that we’ll be sharing with you as a beta soon.

Material Library Expansion

After we have UGC materials fully released and have upgraded the built-in materials, we will start releasing new base materials. This will provide you with more precise materials to use when building, allowing for more flexibility and more accurate emergent behavior.

Finally, the question many of you are asking: when can you use this with shipped experiences?

We keep features in beta so that we can react to your feedback without fear of breaking live experiences, as sometimes addressing your feedback requires major changes. For example, to support per-part material variants, we had to overhaul a lot of the internals of MaterialService! Our goal is to fully ship MaterialService “soon,” but we want to hear what you think and determine how to address any feedback before we begin discussing timing.

Thanks to @fnublox, @programeow, @Homeomorph, @4thchamber, @YodelerYoshi, @TravelerUniverse, and @c0de517e for their continued hard work on UGC Materials!


This topic was automatically opened after 10 minutes.

Absolutely awesome! I’m so glad seeing how much effort and dedication was put into this. Thank you for listening to our feedbacks! :smile:
Some questions, though:

  1. What would be the difference between MaterialVariant objects, and SurfaceAppearance objects? As they seem to have more and more overlapping functionality.

  2. Will we see support for Emission Maps in the near future? Almost all functionality is covered at this point, but it’d be awesome being able to make some materials, such as lava, emit glows much like the Neon material.


I love the steps Roblox is taking to be able to allow users to make the games they want to make, whether it’s basic low poly, or realism. I think this is a very good step for the future of Roblox as a whole.


This is such a great update! I was wary of the system before as it didn’t give us that much control over materials but now I will definitely go check it out. Love how much freedom Roblox gives us now.


I love this update! Waiting for material manager.


SurfaceAppearances are a specific visual customization tied to a mesh. Materials are more broad, reusable objects that (before too long) will support custom physical properties in addition to the visual ones. We hear you that the distinction is fuzzy today: we’ve had lots of internal discussion around it. We think it will become clearer over time. And if not, we’ll reassess.


I just can’t wait until this hits live games. I’ve been experimenting with this feature since I saw it in beta and I’m ready! Terrain detail is gonna change the game.


This seems amazing! I’m really happy to see that the initial backlash against the 2022 materials caused this re-evaluation, because now materials seem to be shaping up to be more flexible than ever. Great job on this.

Just curious, but we will be able to use UGC materials alongside the current materials, right? Not just the 2022 ones?


Yes, but there will be some quirks. For example, the way terrain is tinted is different in pre-2022 mats and UGC+2022-and-beyond. We’re trying to minimize them, however.


I’m speechless, so speechless.
The moment I’ve been waiting for since these new materials came out as a Beta app, and now evolved like never before, thank you so much to everyone who is involved in making this feature sunshine and rainbows for everyone. This is heavily impossible but DevRel proved me wrong!


One thing, now that we have “Terrain Details” do we get the option to choose Decoration details too? I’m not a fan of the way the decoration looks on Future Lighting enabled. I’m aware it was done to save performance, but for showcases and such I’d love more terrain detail options!


This is amazing! Really love this, especially the per-part materials. Ive been waiting for this for a long time.

Small sidenote, how do we replicate current materials in the material variants?
The current materials are like this:

Yet only normal follows the same format as material variants.

I assumed that diffuse would be the ColorMap, normaldetail RoughnessMap, and reflection MetalnessMap, but Im not getting the expected result.


Sounds great! I can definitely work with the tint changes as I’m not super concerned with terrain for my projects. I’m just very happy that I can finally start making my own materials for stuff. Going to be really fun!


I understand the rationale behind unifying both terrain & part materials to use tint coloring, but would it be possible to bring back the hue shifting behavior as a per material option in the future? there are a couple use cases (things like tiny grey rocks in a green grass material, or differently colored nails in a wood planks material) that aren’t possible any more with the new behavior.

either way, thanks so much for all the hard work on this. we appreciate it!


We hear you on the request for custom decorators but it’s not a priority right now.


I totally understand, thank you for replying, but we can expect something like it in the coming months, or years, correct?


You can export object from roblox like .obj file. And all textures (default roblox and texture, decal instances) will be exported to your device aswell.

Do they come with roughness, metalness, and other things that makes them PBR?

We are exploring an alternate approach. Stay tuned.