At Roblox, we are continually upgrading our technology so you can create a wider range of content. Until now, uploaded textures have been limited to a simply-shaded, low detail style. Today we are opening up much more expressive controls. We are proud to present SurfaceAppearance, a new object for assigning PBR textures to MeshParts.
What does SurfaceAppearance do?
SurfaceAppearance allows you to specify new texture inputs to our Physically Based Rendering system for MeshParts:
- Normal maps - add details like bumps and dents to your mesh.
- Metalness maps - make parts of your mesh metallic and highly reflective.
- Roughness maps - control how smooth or rough parts of your mesh are, modifying specular highlights.
Because this PBR format is commonly used in 3D games, artists already familiar with these formats will be able to import their content into Roblox with minimal modification. You can also import meshes from 3rd party stores such as SketchFab, TurboSquid, CGTrader, and more if you have rights to use the content.
Meshes with partially transparent textures using SurfaceAppearance also benefit from proper distance-based occlusion and work better with various effects like DepthOfField and water reflections.
MeshPart.TextureId vs SurfaceAppearance:
How to Use SurfaceAppearance
Learn how to use SurfaceAppearance with our API documentation. (This documentation will be available on the Developer Hub soon).
UPDATE: SurfaceAppearance is now enabled in all games. You still need to opt-in to the Studio Beta to edit SurfaceAppearance instances in Studio. Once we believe the feature is fully stable, we will end the Studio Beta and stop requiring opt-in to edit the instances.
Participating in the Studio Beta
Disclaimer: We had to add new mechanisms to the Roblox engine to make custom PBR textures look good and have minimal impact on memory and performance. These mechanisms have many moving parts, so there may be bugs and areas where the development experience is rough. Some issues you may run into are described later in this post. If you encounter anything, please share your feedback on this thread or send me a message including your model/place file so we can improve the system.
In Studio, under File, select Beta Features.
Find and enable Advanced SurfaceAppearance Textures, then click Save.
Select a MeshPart in your place and press the plus button in the Explorer (or press Ctrl/Cmd + I)
Find and insert a SurfaceAppearance instance.
You should see these properties in your Properties widget. They will be hidden if you haven’t enabled the beta.
A few warnings during the beta:
SurfaceAppearance does not support rbxgameasset:// references.
For some technical reasons, you must use rbxassetid:// format references right now. Currently the texture picker drop down menu uses rbxgameasset references, and will not work on SurfaceAppearance. You need to type or paste your image’s asset id directly in the texture property field. You can get this id by right clicking on your image in the Toolbox or Game Explorer and selecting Copy ID to Clipboard.
We will add support for the texture picker drop down soon.
Roblox Studio can sometimes fail to save SurfaceAppearance data.
If you open a file you previously saved and find that your SurfaceAppearance textures do not appear correct, try changing a property on the SurfaceAppearance then waiting up to 30 seconds for this message to appear in the Output widget before saving or publishing the place again: “Successfully uploaded compressed SurfaceAppearance.” We want over time to make the system robust enough that you never have to worry about this.
While SurfaceAppearance is not active in your published games yet, we have created a special place where it is enabled for testing purposes. You can see it in action here.
SurfaceAppearance does not currently work on regular Parts. The biggest use cases for PBR textures with repeated tiling on arbitrary parts are for making custom looking versions of our built in materials - grass, wood planks, floor tiles, etc. We know there’s high demand for this. Materials with physical data, in addition to custom textures, are a fundamental concept in Roblox that many future features will be built on, so we’ve been taking our time with this. We plan to ship features to support this later this year.
Thanks for reading. I’m excited to see what you all create!