Flutter's 3D engine

Scene extends Flutter into a complete toolkit for building incredible 3D multiplatform apps. Rendering, physics, audio, tooling, and a full asset pipeline.

Gorgeous 3D, made easy

Strong defaults do the heavy lifting. A procedural studio environment, physically based materials, and filmic tone mapping mean an imported model looks good the moment it loads, and turning good into gorgeous is a few lines.

Hot reload everything

Edit a model, a shader, a texture, or the environment and see it change in place, with no restart and no lost state. The asset pipeline hot reloads every asset, on every platform.

Declarative and retained, one engine

Describe a scene with widgets, or drive the retained scene graph directly. The declarative layer reconciles onto that same graph the way Flutter reconciles the widget tree, writing only what changed, so structure becomes a function of state.

Live widgets on 3D surfaces

Put a real, interactive Flutter widget onto a mesh. Buttons press, sliders drag, and animations keep running, even on a curved screen, because there is real Flutter underneath. Scene integrates deeply with Flutter, so you can try it live right here.

Materials without limits

Physically based and unlit materials are built in, and when you need more you write your own. The .fmat format gives you typed parameters and GLSL across the vertex and fragment stages, with engine lighting you can opt into.

A cinematic post stack

Bloom, screen space reflections, ambient occlusion, god rays, depth of field with bokeh, fog, automatic eye adaptation, and anti aliasing with resolution scaling. Scene gives you substantial tooling to compose the look of your whole scene.

Light it like a photograph

Image based lighting wraps a scene in real environment light, a procedural physical sky can light it and aim the sun, and unlimited point and spot lights stay cheap through per light culling, with soft shadows.

Physics, dropped in

Add real rigid body physics with a single component. Character controllers, joints, vehicles, and dynamic stacks, on a pluggable backend you can swap or leave out entirely.

Particles and VFX

A modular particle system with flipbook flames, curl noise smoke, stretched sparks, ribbon trails, and instanced mesh debris. Light a campfire or level a building.

Real captures, in your scene

Load .ply and .splat Gaussian splat captures as ordinary scene nodes and walk through them. Splats and normal geometry occlude each other correctly, so a capture lives in your world.

Generate it at runtime

Primitives, custom geometry from raw vertices, swept and lathe shapes, automatic level of detail, and a noise library whose CPU and GPU sides stay identical. Build worlds on the fly and read geometry back to make more.

An editor that speaks to agents

A desktop scene editor with a built in MCP server, so an AI agent can build and edit your scene through the same undoable commands you use by hand.

Accessible 3D

Attach semantics components to your nodes and their content flows into Flutter's accessibility tree, reachable by screen readers and switch access, with tap and adjust actions and camera-tracked focus. The same tooling covers the live widgets embedded in your 3D scene.

Runs everywhere Flutter runs

One codebase, everywhere Flutter runs. Six platforms including the web, plus custom embedders, all with the same GPU-accelerated rendering. On the web it runs under either the Skwasm or CanvasKit renderer, with no extra setup.

  • iOS
  • Android
  • Web
  • macOS
  • Windows
  • Linux
  • Custom embedders

Made by the engineer who built Flutter GPU

Scene began inside the Flutter Engine, and Flutter GPU was initially built to set it free. Building Scene still pushes Impeller and Flutter GPU forward, so the whole graphics stack gets better because Scene exists.

6platforms, incl. web
40examples
1codebase

Made with Scene

Games
Data and maps
Skinned crowds
On every device

Just vanilla Flutter

No engine fork, no patched SDK, no external renderer to wire up. Scene is a set of ordinary Flutter packages you drop into any project. It renders into a widget alongside the rest of your app, so it stays a part of your project instead of taking it over.