Create VRChat World Textures with Substance 3D Designer
Substance 3D Designer graphs can generate repeatable surface textures for VRChat world geometry. Export the graph outputs as bitmap files, import each map with the correct Unity settings, and connect them according to the material shader used by the world.
Keep the editable graph as the source asset, export only the maps the Unity material needs, and control platform size through Unity import overrides.
- Define and label the required outputs in the Substance graph.
- Export the outputs as static bitmaps at a deliberate resolution.
- Import colour and data textures with different sRGB settings.
- Pack channels to match the selected shader.
- Build both desktop and Android versions and inspect their asset statistics.
VRChat world shaders do not all use the same texture slots or channel layout. Select the desktop and Android shaders first, then export or pack maps to match those exact inputs.
Keep the Graph as the Source Asset
Adobe distinguishes the editable Substance package and graph from its exported bitmaps:
.sbsfiles retain the graph, resources, and editable nodes inside Designer..sbsarfiles are published archives for applications with a compatible Substance integration.- bitmap exports such as PNG or TGA are fixed-resolution snapshots of graph outputs.
Use the .sbs file as the authoring source and place the exported bitmaps in the Unity project's Assets folder. Static bitmaps make the final Unity import settings, platform overrides, and material inputs explicit.
Plan the Texture Outputs
Create only the outputs required by the chosen shader.
| Output | Contains | Unity handling |
|---|---|---|
| Base Color | Visible surface colour without baked scene lighting | Keep sRGB enabled |
| Normal | Tangent-space surface direction data | Set Texture Type to Normal map |
| Metallic | Metallic response, usually a single data channel | Disable sRGB |
| Roughness | Microsurface roughness data | Convert or invert when the shader expects smoothness |
| Ambient Occlusion | Indirect-light occlusion data | Disable sRGB |
| Emissive | Light-emitting colour | Keep sRGB enabled for standard colour output |
| Height | Optional displacement or parallax data | Disable sRGB; include only when the shader uses it |
Base Color and Emissive are colour textures. Metallic, roughness, occlusion, height, masks, and packed channels are numeric data textures; Unity should not apply sRGB colour conversion to those values.
Export Graph Outputs as Bitmaps
Adobe provides two routes to the same export dialog:
- In the Explorer, right-click the graph and choose Export Outputs as bitmaps; or
- In the Graph View, open Tools and choose Export Outputs.
In the export dialog:
- Set a destination folder outside the final Unity folder while checking the files.
- Choose a bitmap format supported by the data and bit depth you need.
- Use a filename pattern built from graph or output identifiers.
- Enable only the outputs required by the material.
- Confirm the graph, output, or parent resolution before exporting.
- Export and inspect every map before copying the final files into Unity.
Designer exports from a graph, not from the package itself. The number and resolution of generated images come from the graph's Output nodes and resolution settings.
Set Colour Space Deliberately
Designer identifies Base Color and Emissive as colour information and metallic, roughness, height, normal, and similar maps as data. Its default colour-management behaviour reflects that distinction.
In Unity:
- enable sRGB (Color Texture) for ordinary Base Color and Emissive maps;
- disable sRGB (Color Texture) for masks and numeric material data;
- set a normal texture's Texture Type to Normal map rather than treating it as ordinary RGB colour.
If the material looks too dark, too bright, washed out, or unusually glossy, compare the Designer output colour space with Unity's sRGB setting before changing the artwork.
Import the Textures into Unity
Select each imported bitmap in Unity's Project window and review its Texture Import Settings.
| Setting | Recommended check |
|---|---|
| Texture Type | Use Normal map only for the normal texture; use Default for most other material maps |
| sRGB | On for colour; off for numeric data and masks |
| Alpha Source | Preserve alpha only when the shader reads it |
| Generate Mip Maps | Enable for ordinary world surfaces viewed at different distances |
| Wrap Mode | Use Repeat for tiling materials; Clamp when the texture must not tile |
| Max Size | Limit the imported resolution to what the surface actually needs |
| Platform Overrides | Set Android-specific size and compression without changing the source bitmap |
| Read/Write | Leave disabled unless a script must access texture pixels on the CPU |
Unity's platform-specific override panel can apply different maximum sizes and compression settings for desktop and Android builds. This keeps one source texture while producing smaller mobile assets.
Connect the Material Maps
Create the Unity material with its final shader before packing channels. Open the shader's documentation or Inspector and record the expected map, channel, and value direction for every slot.
For Unity's built-in Standard metallic workflow:
- Base Color goes to Albedo;
- Metallic uses the red channel of the Metallic map;
- Smoothness uses the alpha channel of that same map;
- the normal texture goes to Normal Map; and
- the grayscale occlusion texture goes to Occlusion.
Designer commonly produces roughness, while Unity Standard consumes smoothness. These values run in opposite directions, so invert roughness before placing it in a smoothness channel. Do not invert it when the selected shader explicitly asks for roughness.
VRChat does not restrict world shaders on Android in the same way it restricts avatar shaders, but it recommends simple, carefully tested shaders. For basic baked world geometry, VRChat identifies Mobile/VRChat/Lightmapped as an optimized option.
Reduce Texture and Material Cost
VRChat's Android optimization guidance recommends keeping textures small, compressing them, and combining related surfaces without over-atlasing an entire world.
Apply these checks to the exported material set:
- Lower Max Size until the difference becomes visible at the closest expected viewing distance, then use the previous acceptable value.
- Avoid exporting height, opacity, or emissive maps when the material does not use them.
- Pack compatible grayscale masks into separate colour channels when the shader supports that layout.
- Reuse a tiling material across appropriate meshes instead of exporting near-identical sets.
- Atlas a related prop group when it reduces materials without preventing useful batching or occlusion separation.
- Avoid transparent materials on mobile when an opaque design can produce the same result.
- Enable GPU Instancing when the selected shader supports it and the material is reused.
Crunch compression affects download size, not the texture's in-memory size. Use resolution, platform format, channel packing, and the number of loaded textures to control runtime memory.
Original Video Companion
The original El Fideo Rubio overview introduces Substance Designer for VRChat material creation. The application and Unity integration have changed since it was recorded, so use the current bitmap export and Unity import workflow above for project files.
Validate the World Build
- Inspect the material under the world's actual baked and realtime lighting.
- Walk close to and far from the surface to check mipmaps and texture density.
- Switch to the Android build target and inspect every platform override.
- Build the world and search the Unity Editor log for the asset statistics described by VRChat.
- Compare build size and texture use after each resolution or packing change.
- Test the uploaded desktop and Android versions on their target devices.
- Confirm cross-platform materials still represent the same world objects and interactions.
VRChat currently limits Android world downloads to 100 MB after build-time compression. Treat that as an upload ceiling rather than a texture budget target; the world also needs runtime memory for geometry, lightmaps, audio, scripts, and player content.
The material is much darker in Unity than in Designer.
Check the exported colour space and Unity's sRGB setting first. Base Color and ordinary Emissive maps should usually use sRGB, while masks and numeric data should not.
The normal map creates dents instead of bumps.
Confirm Unity imported it as a Normal map and check the normal convention expected by the shader. Do not treat the normal texture as a colour map or invert channels without checking the target shader.
The surface is glossy where it should be rough.
Check whether the shader expects roughness or smoothness. Unity Standard expects smoothness, so a Designer roughness output must be inverted before it is packed into the Metallic map's alpha channel.
The packed mask gives incorrect metallic or occlusion values.
Disable sRGB on the packed texture and verify each channel against the shader's documented layout. Channel packing is shader-specific; a layout made for one shader cannot be assumed to work in another.
The texture looks sharp nearby but shimmers at a distance.
Enable mipmaps for the world-surface texture and inspect its filtering. Then test in motion on the target headset rather than relying only on a still Scene view.
The Android build is still too large.
Review Android platform overrides, lower Max Size, remove unused outputs, pack compatible masks, and reduce duplicate materials. Crunch can reduce download size but does not reduce the texture's in-memory size.
Changes in Designer do not appear in Unity.
Export the graph outputs again and overwrite the bitmap files imported by Unity. Editing the .sbs graph does not automatically change previously exported static textures unless automatic export is deliberately configured.
Official References
- Adobe Substance 3D Designer: Exporting Bitmaps
- Adobe Substance 3D Designer: Color Management
- Unity Texture Import Settings
- Unity Default Texture Import Settings
- Unity Normal Map Import Settings
- VRChat Android Content Optimization
Related Guides
- VRChat World Creation Guide
- VRChat Baked Lighting Tutorial
- Atlas Textures for a VRChat World
- World Optimization Checklist
- VRChat Documentation
Topics: Substance Designer, world textures, Unity materials, texture import, Android optimization