HDR 360 Generate
Turn one image into an environment map your 3D app will load
- source_image
- panorama
- projection_map
You generated a nice wide landscape, a moody corridor, a sunset over water - and now you want it around a 3D object as lighting, not just behind it in a flat render. That's what an equirectangular HDRI is, and that's what HDR 360 Generate produces. It reprojects a still into a full 360×180 sphere using the projection maths that environment maps actually need, and hands you back a panorama you can drop into Blender, Unreal, or any PBR viewer.
Bluntly: this is a projection node, not a magic HDRI camera. It rotates, samples and resamples the pixels you give it. If you want real highlight headroom above SDR white, feed it scene-linear data - the Radiance SDR→HDR path or the expand/encode nodes earlier in the graph - because the 360 node won't invent dynamic range for you.
How it works
The node builds a direction vector for every output pixel: equirectangular maps each pixel to a longitude/latitude pair on the unit sphere, cube maps split it into six faces picked by dominant axis, mirror-ball and angular map modes do the fisheye-style variants. Those directions get rotated by the X/Y/Z parameters, converted back into source-image UVs, and sampled with the interpolation you choose. Areas that fall outside the source frame are handled by fill_mode - Mirror reflects, Repeat tiles, Edge smears the border, Black leaves empty.
It returns two images: panorama, the thing you actually want, and projection_map, a UV map that exists purely so you can see where the sampler is pulling from when the result looks wrong.
Inputs worth setting
source_image wants something wide. A square 1024×1024 crop is a bad source for a 360 sphere - the sampler stretches the corners into the poles, and you'll get a swirl. A panoramic or at least wide shot holds up far better.
projection_type is the output format. Equirectangular is the standard HDRI layout (most 3D apps default to it). Cube_Map is what modern engines like internally. Mirror_Ball and Angular_Map are the legacy reference-ball formats - useful for matching a shot plate, less useful for lighting.
output_width / output_height default to 4096 × 2048, which is the "standard HDRI" tier the tooltip names (2048×1024 preview, 8192×4096 high, 16384×8192 ultra). Keep the 2:1 ratio for equirectangular or you're asking for a squashed horizon. interpolation defaults to Lanczos and should stay there unless you're iterating fast - Nearest is for debugging, not delivery.
The optional horizontal_fov / vertical_fov (defaults 360/180) let you generate a partial panorama - a 180° band around the horizon, say. rotation_x/y/z in degrees repositions the horizon, and exposure_adjust is a plain stop offset on the way out.
Install
Manager → search Radiance → Install → restart ComfyUI → refresh. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Nothing model-wise is required here. The heavy imports the pack pulls in (OpenImageIO, OpenColorIO, OpenEXR, diffusers, accelerate) are for the other 140-odd nodes; if you only want this one you'll still pay for them at install time.
Where people get burned
The 16K setting lies to you. It resamples, so output resolution is not detail: a 1K source blown up to 16384×8192 is a soft, smeared sphere that takes far longer and eats a lot of memory. Match the output size roughly to what the source can support.
Watch fill_mode too. Black on an equirectangular output gives you a black hole at the poles and a hard seam at the wrap, which looks like a bug and isn't. Mirror is the sane default for a full sphere from a partial source.
And a general Radiance note from the community thread that put this pack on r/comfyui's radar: someone there complained it "won't create real 16/32-bit EXR" - true enough if your source is an 8-bit PNG. Projection can't add precision it never had. Decode to float first if that matters.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| source_image | IMAGE | Input image to project. For best results, use a wide or panoramic image. | |
| projection_type | COMBO | Equirectangular | Projection type: Equirectangular (standard HDRI), Cube_Map (6-face), Mirror_Ball (chrome ball), Angular_Map (light probe). |
| output_width | INT | 4096512–16384 | Output panorama width in pixels. Standard HDRI sizes: 2048 (preview), 4096 (standard), 8192 (high), 16384 (ultra). |
| output_height | INT | 2048256–8192 | Output panorama height. For equirectangular, height should be half of width (2:1 ratio). |
| horizontal_fovopt | FLOAT | 36030–360 | Horizontal field of view in degrees. 360° = full sphere, less = partial panorama. |
| vertical_fovopt | FLOAT | 18015–180 | Vertical field of view in degrees. 180° = pole to pole, less = band around horizon. |
| rotation_xopt | FLOAT | 0-180–180 | Rotation around X axis (pitch) in degrees. Tilts the panorama up/down. |
| rotation_yopt | FLOAT | 0-180–180 | Rotation around Y axis (yaw) in degrees. Rotates the panorama left/right. |
| rotation_zopt | FLOAT | 0-180–180 | Rotation around Z axis (roll) in degrees. Tilts the horizon. |
| interpolationopt | COMBO | Lanczos | Sampling interpolation: Lanczos (highest quality), Bicubic (good), Bilinear (fast), Nearest (pixelated). |
| fill_modeopt | COMBO | Mirror | How to fill areas outside source image: Mirror (reflects), Repeat (tiles), Black (transparent), Edge (extends edge pixels). |
| exposure_adjustopt | FLOAT | 0.0-5–5 | Exposure adjustment in stops. +1 = double brightness, -1 = half brightness. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| panorama | IMAGE | Generated 360° panorama. |
| projection_map | IMAGE | UV projection map for debugging. |