在线把 HDRI 转换成 cubemap 面——拖入一张 .hdr 或 .exr 全景图,直接拿到六张真 HDR 立方体面,文件全程不用上传。
把 HDRI 拖到这里
或点击选择 · .hdr / .exr · 最大 50 MB
超过 1.0 的亮度值会完整保留:你的 .hdr 或 .exr 先解码为线性浮点数据,在浮点精度下重新采样,再编码回 Radiance RGBE,太阳光斑和明亮天空的层次都不会被削掉。
解码、立方体投影和 ZIP 打包全部在你自己设备的 Web Worker 里完成,HDRI 从不上传——不用排队,不用注册。
Radiance .hdr 和 OpenEXR .exr 都能直接用,最大 50 MB。half-float 格式的 EXR 会先扩展为 32-bit float,再进入 cubemap 投影计算。
按 Unity 的 Skybox/6 Sided 插槽、Three.js 的 px/nx/py/ny/pz/nz,或 OpenGL 的 pos_x/neg_x 规范命名 cubemap 面——你的加载器要什么格式就给什么格式。
Radiance 数据本身没有唯一「正确」的亮度,所以用一个 −5 到 +5 stops 的滑杆对预览做色调映射,而 ZIP 里的浮点 cubemap 不受任何影响。
既拿六张用于光照计算的 Radiance .hdr 面,也拿同一套 cubemap 色调映射成的 8-bit PNG——留给只吃 LDR 面图的引擎。
把一张 2:1 等距柱状的 HDRI 拖进上方的框里,或点击选择文件。文件在本地读取,不会离开你的设备。
选择 512、1024 或 2048 px 的 cubemap 面尺寸,并把立方体旋转 0-360°,让太阳落在你想要的位置。
点击「转换为 HDR cubemap」。Worker 会把 HDRI 解码成浮点数据,再逐一渲染六个面,实时汇报每一面的进度。
把六张按 Unity、Three.js 或 OpenGL 规范命名的 Radiance .hdr 面打包下载;如果需要 8-bit 版本,再拿一份色调映射后的 PNG。
这个 HDR 转 cubemap 转换器让两种容器格式走同一条浮点流水线:一次 EXR 转 cubemap 任务和一次 .hdr 任务算出的面几何完全一致,区别只在解码器。Radiance .hdr 按 RGBE 读取并展开为浮点;.exr 按 32-bit float 读取,half-float 文件会先扩展位深。只有亮度通道的 EXR 同样会展开成四通道。
源文件必须是 2:1 等距柱状图——4096×2048、8192×4096,只要宽正好是高的两倍都行。文件上限 50 MB:所有解码都在内存里完成,一张 4K 浮点源图解开后已经接近 ~130 MB。cubemap 面输出为正方形,可选 512、1024 或 2048 px;面尺寸不超过源图高度,能避免放大导致的模糊。
主下载项是六张 Radiance .hdr 面,以 RGBE 格式存储——三个 8-bit 尾数加一个共享指数,这正是 .hdr 能装下远超 1.0 的亮度值的原理。这也是 image-based lighting 真正需要的:渲染器采样这个 cubemap 时,太阳依然比天空亮上几千倍,反射和阴影对比度才会算对。
色调映射后的 PNG ZIP 是次要下载项,而且是故意有损的:每张面先按滑杆的 stops 值曝光,再做 Reinhard 压缩、gamma 编码,最后量化到 8 bit。它只适合目标只吃 LDR 面图的场合——比如一个普通的 WebGL 天空盒、CubeTextureLoader 背景。不要用它来做场景光照:曝光裁掉的部分永远找不回来了。
| 输出 | 包含内容 | 最适合 |
|---|---|---|
| 6 × .hdr 面(ZIP) | Radiance RGBE 浮点数据,完整动态范围 | IBL、反射探针、HDR 天空盒 |
| 6 × .png 面(ZIP) | 8-bit sRGB,按你的曝光值做过色调映射 | LDR 天空盒背景、预览 |
| 页面缩略图 | 256 px 色调映射预览图 | 核对朝向、排查接缝 |
Unity 会把 Radiance .hdr 当作 HDR 贴图导入。用 Unity 预设导出,把每张面拖进同名的 Skybox/6 Sided 插槽,再到 Lighting → Environment 里指派这个材质。记得保留 HDR 贴图格式,高光才不会被截断。
Blender 的 Environment Texture 节点只认 equirectangular 或 mirror-ball 这类单张图片,不接受六张独立面图,所以 cubemap 并不是它原生支持的世界贴图输入。这些面请留给真正需要 cube faces 的引擎;想合并回一张图,用 Cubemap 转全景图。
HDRCubeTextureLoader(three/examples/jsm/loaders)读取六张 .hdr 面: new HDRCubeTextureLoader().setPath('/cube/').load(['px.hdr','nx.hdr','py.hdr','ny.hdr','pz.hdr','nz.hdr'], (tex) => { scene.environment = tex; }); 用 Three.js 预设导出,保证正是这个顺序,然后再喂给 PMREMGenerator。
该用哪个工具,看你手上已经有什么。8-bit 的 JPG、PNG 或 WebP 全景图属于 Cubemap 生成器——同样的立方体投影,只是 LDR 像素、PNG 面图,而且本页的解码器本来就会拒收这类文件。.hdr 或 .exr 才属于这个页面:绕道 8-bit 会白白丢掉让它成为 HDRI 的那部分动态范围。
还没有 HDRI?AI HDRI 生成器 能根据文字提示词写出一份 Radiance .hdr——它是 LDR 源像素封装的容器,适合当背景和柔和光源,而不是精确的太阳强度数据,但依然可以拿到这里转换成 cubemap。反过来,把六个面拼回一张 2:1 图片,用 Cubemap 转全景图。
先用 AI HDRI 生成器 靠一句提示词生成 360° 环境贴图,再把导出的 Radiance .hdr 拿回这里,切成六个 cubemap 面。
会。六张 .hdr 面完整保留从源文件解码出的浮点数值——输入是线性浮点,输出是 Radiance RGBE,远超 1.0 的亮度像素在 cubemap 里照样存在。
不会,你的 HDRI 从不会离开你的设备。解码、立方体投影和 ZIP 打包都在浏览器里的 Web Worker 中完成——整个流程根本没有上传这一步。
可以,OpenEXR .exr 和 Radiance .hdr 走完全相同的转换流程。half-float 格式的 EXR 会先扩展成 32-bit float,再进入同一套 cubemap 投影计算。
曝光滑杆只是一个预览控制项,永远不会改变你下载的 .hdr cubemap 面。它只重新计算缩略图的色调映射效果,同一个曝光值也会被烘进可选的 PNG ZIP 里。
cubemap 转换需要 2:1 等距柱状源图,只要宽不是高的正好两倍,解码后就会被拒收。如果你的素材是 mirror-ball 探针图,请先重新投影成等距柱状格式。
Skybox/6 Sided 材质选 Unity 预设,px/nx/py/ny/pz/nz 选 Three.js,pos_x/neg_x 选 OpenGL。Unity 预设是按每个 cubemap 面所属的插槽来命名的——包括 Unity 那个反直觉的 Left [+X] 插槽——所以文件名和插槽名始终对得上。
对 4K HDRI 来说,1024 px 是安全的默认值。Radiance 面图体积不小——一张 2048 的面压缩前大约 16 MB——只有源图高度足够时才值得选更大尺寸。
把六个面合并回一张 2:1 图片要用另一个工具,Cubemap 转全景图转换器。它只接受 8-bit 面图,所以要喂给它色调映射后导出的 PNG。