Free HDRI to Cubemap Converter

Convert HDRI to cubemap faces online — drop in a .hdr or .exr panorama and get six true-HDR cube faces back, without ever uploading your file.

Drop your HDRI here

or click to browse · .hdr / .exr · up to 50 MB

A free HDRI to cubemap converter for IBL and skyboxes

True HDR, not tone-mapped

Values above 1.0 survive: your .hdr or .exr is decoded to linear float, resampled in float, then re-encoded as Radiance RGBE, so the HDR cubemap keeps sun discs and bright sky.

100% in-browser

Decoding, cube projection and ZIP packing run in a Web Worker on your own machine. Your HDRI is never uploaded — no queue, no account.

.hdr and .exr input

Radiance .hdr and OpenEXR .exr both work, up to 50 MB. Half-float EXRs are widened to 32-bit float before the cubemap projection starts.

Engine naming presets

Name the cubemap faces for Unity’s Skybox/6 Sided slots, Three.js px/nx/py/ny/pz/nz, or OpenGL pos_x/neg_x — whatever your loader expects.

Exposure preview slider

Radiance data has no single correct brightness, so a slider tone-maps the faces from −5 to +5 stops. The floating-point cubemap in the ZIP stays untouched.

Two downloads, one conversion

Take six Radiance .hdr faces for lighting, plus the same cubemap tone-mapped to 8-bit PNGs for engines that only accept LDR faces.

How to convert an HDRI to a cubemap online

  1. 1. Upload a .hdr or .exr

    Drop a 2:1 equirectangular HDRI onto the box above, or click to pick one. The file is read locally, so nothing leaves your device.

  2. 2. Set rotation and face size

    Choose 512, 1024 or 2048 px cubemap faces, and rotate the cube 0-360° so the sun lands where you want it.

  3. 3. Convert to a cubemap

    Click Convert to HDR cubemap. A worker decodes the HDRI to float, then renders all six cube faces, reporting progress per face.

  4. 4. Download the faces

    Grab the six Radiance .hdr faces as a ZIP named for Unity, Three.js or OpenGL — plus tone-mapped PNGs if you need 8-bit copies.

Supported input: EXR to cubemap and HDR to cubemap

This HDR to cubemap converter runs both containers through one floating-point pipeline, so an EXR to cubemap job and a .hdr job give identical face geometry — only the decoder differs. Radiance .hdr is read as RGBE and expanded to float; .exr is read at 32-bit float, half-float files widened first. Luminance-only EXRs expand to four channels too.

The source must be 2:1 equirectangular — 4096×2048, 8192×4096, anything exactly twice as wide as tall. Files cap at 50 MB: everything decodes in memory, and a 4K float source already unpacks to ~130 MB. Cubemap faces come out square at 512, 1024 or 2048 px; staying at or below your source height avoids upscaling softness.

True HDR cubemap faces vs. tone-mapped PNG

The primary download from this HDRI to cubemap converter is six Radiance .hdr faces, stored as RGBE — three 8-bit mantissas plus a shared exponent, which is how a .hdr carries values far above 1.0. That is what image-based lighting needs: a renderer sampling this cubemap still sees the sun thousands of times brighter than the sky, so reflections and shadow contrast come out right.

The tone-mapped PNG ZIP is secondary and lossy on purpose: each face is exposed by the slider’s stops, Reinhard-compressed, gamma-encoded and quantised to 8 bits. Use it when your target only eats LDR faces — a plain WebGL skybox, a CubeTextureLoader background. Don’t light a scene with it; whatever the exposure clipped is gone for good.

OutputWhat it containsBest for
6 × .hdr faces (ZIP)Radiance RGBE floats, full dynamic rangeIBL, reflection probes, HDR skyboxes
6 × .png faces (ZIP)8-bit sRGB, tone-mapped at your exposureLDR skybox backgrounds, previews
On-page thumbnails256 px tone-mapped previewsChecking orientation, spotting seams

Use your HDR cubemap in Unity, Blender & Three.js

Unity

Unity imports Radiance .hdr as an HDR texture. Export with the Unity preset, drag each face into the Skybox/6 Sided slot of the same name, then assign the material under Lighting → Environment. Keep an HDR texture format so highlights stay unclamped.

Blender

Blender’s Environment Texture node projects equirectangular or mirror-ball images, not six loose faces, so a cubemap is not its natural world input. Keep these faces for engines that want cube faces; for one image back, use Cubemap to Panorama.

Three.js

HDRCubeTextureLoader (three/examples/jsm/loaders) reads six .hdr faces: new HDRCubeTextureLoader().setPath('/cube/').load(['px.hdr','nx.hdr','py.hdr','ny.hdr','pz.hdr','nz.hdr'], (tex) => { scene.environment = tex; }); Export with the Three.js preset for that exact order, then run it through PMREMGenerator.

HDRI to cubemap vs. panorama to cubemap

Pick the tool by what you already have. An 8-bit JPG, PNG or WebP panorama belongs in the Cubemap Generator — same cube projection, LDR pixels, PNG faces — and the decoders here reject it anyway. A .hdr or .exr belongs on this page: an 8-bit detour throws away the range that made it an HDRI.

No HDRI yet? The AI HDRI Generator writes a Radiance .hdr from a text prompt — an LDR-source container, so treat it as a background and soft-lighting asset rather than measured sun intensity. It still converts to a cubemap here.

No HDRI to convert yet?

Generate a 360° environment map from a prompt with the AI HDRI Generator, then bring the Radiance .hdr back here and run the HDRI to cubemap conversion.

HDRI to Cubemap Converter FAQ

Does this HDRI to cubemap converter keep true HDR data?

Yes. The six .hdr faces keep the floating-point values decoded from your source — linear float in, Radiance RGBE out — so pixels far brighter than 1.0 survive in the cubemap.

Is my HDRI uploaded to a server?

No, your HDRI never leaves your device. Decoding, cube projection and ZIP packing all happen in a Web Worker inside your browser — there is no upload step at all.

Can I convert an EXR to a cubemap?

Yes — EXR to cubemap conversion works exactly like Radiance .hdr. Half-float EXRs are widened to 32-bit float first, then take the same cubemap projection.

What does the exposure slider change?

The exposure slider is a viewing control and never alters the .hdr cubemap faces you download. It re-tone-maps the thumbnails, and that same exposure is baked into the optional PNG ZIP.

Why was my HDRI rejected as not 2:1?

HDRI to cubemap conversion needs a 2:1 equirectangular source, so an HDRI that is not exactly twice as wide as tall is rejected after decoding. Re-project mirror-ball probes first.

Which naming convention should I pick?

Pick Unity for a Skybox/6 Sided material, Three.js for px/nx/py/ny/pz/nz, or OpenGL for pos_x/neg_x. The Unity preset names each cubemap face after the slot it belongs in — including Unity’s counter-intuitive Left [+X] — so names match slots.

What face size should I use for an HDR cubemap?

1024 px is the safe default for a 4K HDRI. Radiance faces are heavy — a 2048 face is about 16 MB before zipping — so go higher only when your source height supports it.

Can I turn cubemap faces back into an equirectangular HDRI?

Merging six faces into one 2:1 image is a separate tool, the Cubemap to Panorama Converter. It takes 8-bit faces, so feed it the tone-mapped PNG export.