Photoreal Sponza atrium rendered by MuJoFil
by Tau Intelligence · open source

Photoreal worlds for
vision-based robot learning.

MuJoFil turns a GPU-resident physics simulation into photoreal training observations, using a parallel rasterization renderer forked from Google Filament. Drop in any environment and train your robot's policy inside it.

What it is

Photoreal rendering, fused with GPU physics.

One pipeline that gives a parallel robot simulation the eyes it never had.

MuJoFil drives a purpose-built, GPU-parallel rasterization renderer, forked from Google Filament, on top of a GPU-resident physics simulation. You get fast parallel dynamics and genuinely photoreal frames from the same loop, ready for your policy network. No offline rendering, no second machine, no compromise between speed and looks.

The renderer, the parallel batch path, and the training-ready observation pipeline are what make MuJoFil: together they do something a standard robotics simulator cannot, loading a real 3D environment and lighting it with full PBR, image-based lighting, soft shadows and reflections, all in one parallel GPU pass.

τ

High fidelity on hardware you already own. Ray-traced stacks like Omniverse demand high-end RTX cards. MuJoFil delivers photoreal PBR on a mid-range GPU by rendering through an efficient rasterization pipeline, so realistic vision-RL is no longer gated behind datacenter hardware.

How it works

From GPU physics to a training observation.

One step of the loop, end to end.

01 · Physics

The simulation steps N worlds

Thousands of parallel MuJoCo worlds advance entirely on the GPU as CUDA kernels.

→
02 · Render

Filament fork, one instanced pass

A forked Filament GL backend draws every world in a single gl_Layer pass, with full PBR, IBL, shadows and reflections.

→
03 · Deliver

Straight into PyTorch

Frames land in GPU memory as torch.cuda tensors, ready for a CNN, ViT or VLA policy.

⚡

Parallel rasterization

A forked Filament GL backend renders many worlds in one instanced draw with per-world GPU transforms, parallel by construction rather than a per-world Python loop.

☀

Real materials and light

Metalness and roughness PBR, image-based lighting, soft shadows, SSAO, bloom, screen-space reflections and filmic tone mapping: the appearance cues flat renderers lack.

◆

Tuned for the training loop

Quality presets trade fidelity for throughput with one keyword, the renderer keeps pixels on the GPU, and observations arrive as PyTorch tensors with no detour.

Drop in any world

Train inside real environments.

A standard robotics simulator cannot load real 3D scenes. MuJoFil can. Pull a model from Sketchfab, Poly Haven or any glTF, GLB, OBJ or USD source and train your robot's policy inside a photoreal world, with an optional tool that auto-generates the collision mesh so the robot actually interacts with the geometry.

The renders on this page are all produced by MuJoFil, fresh: Intel Sponza, an industrial warehouse, a modern living room, a café and an art gallery.

Industrial warehouse rendered by MuJoFil
Industrial warehouse · PBR floor, ceiling fixtures, reflections
Watch

MuJoFil in motion.

The cinematic walkthrough: environments, the renderer and the pipeline.

MuJoFil video
Get started

One install, one import.

Your code imports only mujofil. The physics and the renderer are driven for you.

# one self-contained wheel, an NVIDIA GPU is all you need
$ pip install mujofil
import mujofil

# GPU physics plus photoreal rendering, one object
scene = mujofil.ParallelScene(
    "scene.xml", num_worlds=32,
    width=256, height=256, preset="high")

for _ in range(100):
    scene.step()                  # GPU physics
    obs = scene.render(camera=0)  # (32,256,256,4) torch.cuda

What you get out of the box.

Photoreal observations as PyTorch tensors, ready for a CNN, ViT or VLA policy. Quality presets (high, fast, train and more) trade fidelity for throughput with one keyword. Any environment via the optional [usd] tooling that converts a GLB or USD scene into a visual mesh plus a MuJoCo collision body.

The wheel is self-contained: Filament and the CUDA runtime are baked in. The only runtime requirement is an NVIDIA GPU and driver. Linux x86-64, Python 3.10 to 3.13.