Roblox Studio Beta Adds Asset ID and DataModel Content Support to CreateSurfaceAppearanceAsync

The new beta lets developers mix EditableImages, DataModel Content, and published asset IDs in a single SurfaceAppearance, cutting memory use and removing the need to convert every texture to an EditableImage at runtime.

THE SHORT ANSWER

Roblox has opened a Studio beta that expands AssetService:CreateSurfaceAppearanceAsync to accept DataModel Content and rbxassetid:// URLs alongside EditableImages. Developers can now combine all three source types in one SurfaceAppearance, reducing memory overhead by letting the engine transcode published assets to a more efficient format. The feature is gated behind the "Mixed Content for CreateSurfaceAppearanceAsync" beta flag in File > Beta Features.

  • CreateSurfaceAppearanceAsync now accepts three content types: EditableImage, DataModel Content, and Asset IDs
  • Published asset IDs no longer need conversion to EditableImage, lowering runtime memory footprint
  • DataModel Content bakes generated images into an optimized format suitable for static procedural textures
  • Beta must be enabled via File > Beta Features > "Mixed Content for CreateSurfaceAppearanceAsync"
  • A single SurfaceAppearance can mix all three source types for different maps (ColorMap, MetalnessMap, EmissiveMask, etc.)

What Changed

Roblox has shipped a Studio beta that expands the runtime creation path for SurfaceAppearance objects. Previously, AssetService:CreateSurfaceAppearanceAsync only accepted EditableImage objects for each texture map. As of November 5, the method also takes DataModel Content and published asset IDs (rbxassetid:// URLs), and developers can mix all three types in a single call.

The change targets creators who generate or fetch textures at runtime — procedural material authors, UGC tool builders, and experience developers who swap surface details on the fly. The beta flag is "Mixed Content for CreateSurfaceAppearanceAsync" under File > Beta Features.

Memory and Performance Rationale

The official announcement frames the update as a memory and performance win. When a published asset ID is supplied directly, the engine transcodes it to an internal format that is more compact than the EditableImage representation. DataModel Content, produced via AssetService:CreateDataModelContentAsync, bakes an EditableImage into a read-only, optimized blob suited for procedural textures that are generated once and never modified.

In practice, this means a developer can keep a library of metalness, roughness, or normal maps as published assets, reference them by ID, and avoid the overhead of loading each one into an EditableImage just to feed CreateSurfaceAppearanceAsync.

How to Enable and Call the API

  1. Open Studio, go to File > Beta Features, check "Mixed Content for CreateSurfaceAppearanceAsync", and restart Studio.
  2. Use AssetService:CreateSurfaceAppearanceAsync with a table whose keys are map names (ColorMap, MetalnessMap, NormalMap, RoughnessMap, EmissiveMask, etc.). Each value can be:
    • Content.fromObject(editableImage) for live-editable textures
    • Content.fromObject(dataModelContent) for baked procedural data
    • Content.fromUri("rbxassetid://12345678") for published assets
  3. The returned SurfaceAppearance behaves like any other instance; most properties (EmissiveStrength, Metalness, etc.) remain mutable after creation.

Example: Three Sources in One SurfaceAppearance

The announcement includes a LocalScript sample that builds a single SurfaceAppearance from all three content types:

  • ColorMap: a 4×4 green EditableImage drawn at runtime
  • EmissiveMask: a 128×128 DataModel Content baked from an EditableImage containing two red circles
  • MetalnessMap: the published asset rbxassetid://658743164 (a Roblox logo)

The script parents the resulting SurfaceAppearance to a MeshPart created from asset 16799342206. Because the ColorMap remains an EditableImage, further DrawRectangle or DrawCircle calls on that image update the surface immediately without re-invoking CreateSurfaceAppearanceAsync. The EmissiveMask and MetalnessMap are static for the lifetime of the object.

What Remains Unclear

Roblox has not published a full list of which SurfaceAppearance map slots accept the new content types, nor whether there are size or format constraints on the baked DataModel Content. The beta is labeled "Studio Beta" rather than "Engine Beta," suggesting the runtime behavior may still shift before a general release. No timeline for graduation from beta was provided, and the example place file (1.2 MB) is the only distributed test asset at this stage.

KEEP READING

More from this desk