◎ Radiance HDR 360 Generate
Turn a flat image into an HDRI you can light a scene with
- source_image
- panorama
- projection_map
3D artists have a specific, chronic need: an HDR environment map to light a scene, ideally with the exact mood of some image they already like. That's what HDR360Generate is for. Feed it a wide or panoramic image and it projects it into a full 360° equirectangular HDRI - the standard format Blender, Unreal, and Octane all accept as an environment texture - and hands you a float image you can save as EXR and drop into your renderer.
The realistic flow: generate a wide panoramic image in ComfyUI, run it through this node at 4096×2048, save the result as EXR, and light your 3D scene with it. The pack's whole point is that the output stays in float, so your environment map carries real highlight values instead of an 8-bit approximation.
How it works
The node does spherical remapping: it takes each output pixel, converts it to a point on the unit sphere (equirectangular θ/φ math - the source literally does u, v → theta, phi → x, y, z), applies any rotation you asked for via 3D rotation matrices (pitch/yaw/roll), then samples your source image at those UVs. Areas of the sphere that fall outside your source get filled per the fill_mode - Mirror (default, reflects), Repeat (tiles), Edge (stretches), or Black. Interpolation defaults to Lanczos for quality.
The inputs that matter
- projection_type - Equirectangular (the standard, keep it), Cube_Map, Mirror_Ball, or Angular_Map. The others exist for specific workflows; 95% of the time you want Equirectangular.
- output_width / output_height - default 4096×2048. For equirectangular, height should be half the width (2:1). 8192 if you want it crisp up close; 2048 for a quick preview.
- horizontal_fov / vertical_fov - 360°/180° fills the whole sphere; drop them for a partial panorama band.
- rotation_x/y/z - aim the map so the light source lands where you want it.
- fill_mode and interpolation - quality controls for what happens beyond the source edges.
- exposure_adjust - in stops, for matching the map's brightness to your scene's scale.
Outputs: panorama (the equirectangular image) and projection_map (a UV debug view showing how the source is being sampled - wire it to a preview the first time you use the node so you can see the distortion pattern you're fighting).
The honest caveats
This is a projection, not a reconstruction. A wide landscape in becomes a panorama out, but the poles (top/bottom of the sphere) stretch whatever's there, which is why a horizon-heavy source works best and a portrait of your cat becomes an abstract nightmare. And mirror/repeat fills are visible seams in a good renderer, so shoot for a source that's already near-panoramic. Also note the node preserves the dynamic range of the input - an HDR-float image in gives you an HDR map worth lighting with; an 8-bit PNG gives you a flat map that will make your render look flat.
Install
ComfyUI Manager → search Radiance, or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements.txt
Restart. Under FXTD Studios/Radiance/Image.
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. |