免费 HDRI 转 Cubemap 转换器

在线把 HDRI 转换成 cubemap 面——拖入一张 .hdr 或 .exr 全景图,直接拿到六张真 HDR 立方体面,文件全程不用上传。

把 HDRI 拖到这里

或点击选择 · .hdr / .exr · 最大 50 MB

面向 IBL 和天空盒的免费 HDRI 转 cubemap 转换器

真 HDR,不是色调映射

超过 1.0 的亮度值会完整保留:你的 .hdr 或 .exr 先解码为线性浮点数据,在浮点精度下重新采样,再编码回 Radiance RGBE,太阳光斑和明亮天空的层次都不会被削掉。

100% 浏览器内运行

解码、立方体投影和 ZIP 打包全部在你自己设备的 Web Worker 里完成,HDRI 从不上传——不用排队,不用注册。

.hdr 与 .exr 双输入

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 面图的引擎。

如何在线把 HDRI 转换成 cubemap

  1. 1. 上传一个 .hdr 或 .exr

    把一张 2:1 等距柱状的 HDRI 拖进上方的框里,或点击选择文件。文件在本地读取,不会离开你的设备。

  2. 2. 设置旋转角度和面尺寸

    选择 512、1024 或 2048 px 的 cubemap 面尺寸,并把立方体旋转 0-360°,让太阳落在你想要的位置。

  3. 3. 转换为 cubemap

    点击「转换为 HDR cubemap」。Worker 会把 HDRI 解码成浮点数据,再逐一渲染六个面,实时汇报每一面的进度。

  4. 4. 下载六个面

    把六张按 Unity、Three.js 或 OpenGL 规范命名的 Radiance .hdr 面打包下载;如果需要 8-bit 版本,再拿一份色调映射后的 PNG。

支持的输入格式:EXR 转 cubemap 与 HDR 转 cubemap

这个 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;面尺寸不超过源图高度,能避免放大导致的模糊。

真 HDR cubemap 面 vs. 色调映射 PNG

主下载项是六张 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、Blender 和 Three.js 中使用你的 HDR cubemap

Unity

Unity 会把 Radiance .hdr 当作 HDR 贴图导入。用 Unity 预设导出,把每张面拖进同名的 Skybox/6 Sided 插槽,再到 Lighting → Environment 里指派这个材质。记得保留 HDR 贴图格式,高光才不会被截断。

Blender

Blender 的 Environment Texture 节点只认 equirectangular 或 mirror-ball 这类单张图片,不接受六张独立面图,所以 cubemap 并不是它原生支持的世界贴图输入。这些面请留给真正需要 cube faces 的引擎;想合并回一张图,用 Cubemap 转全景图

Three.js

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。

HDRI 转 cubemap vs. 全景图转 cubemap

该用哪个工具,看你手上已经有什么。8-bit 的 JPG、PNG 或 WebP 全景图属于 Cubemap 生成器——同样的立方体投影,只是 LDR 像素、PNG 面图,而且本页的解码器本来就会拒收这类文件。.hdr 或 .exr 才属于这个页面:绕道 8-bit 会白白丢掉让它成为 HDRI 的那部分动态范围。

还没有 HDRI?AI HDRI 生成器 能根据文字提示词写出一份 Radiance .hdr——它是 LDR 源像素封装的容器,适合当背景和柔和光源,而不是精确的太阳强度数据,但依然可以拿到这里转换成 cubemap。反过来,把六个面拼回一张 2:1 图片,用 Cubemap 转全景图

还没有 HDRI 可以转换?

先用 AI HDRI 生成器 靠一句提示词生成 360° 环境贴图,再把导出的 Radiance .hdr 拿回这里,切成六个 cubemap 面。

HDRI 转 Cubemap 转换器常见问题

这个 HDRI 转 cubemap 转换器会保留真 HDR 数据吗?

会。六张 .hdr 面完整保留从源文件解码出的浮点数值——输入是线性浮点,输出是 Radiance RGBE,远超 1.0 的亮度像素在 cubemap 里照样存在。

我的 HDRI 会上传到服务器吗?

不会,你的 HDRI 从不会离开你的设备。解码、立方体投影和 ZIP 打包都在浏览器里的 Web Worker 中完成——整个流程根本没有上传这一步。

可以把 EXR 转换成 cubemap 吗?

可以,OpenEXR .exr 和 Radiance .hdr 走完全相同的转换流程。half-float 格式的 EXR 会先扩展成 32-bit float,再进入同一套 cubemap 投影计算。

曝光滑杆改变的是什么?

曝光滑杆只是一个预览控制项,永远不会改变你下载的 .hdr cubemap 面。它只重新计算缩略图的色调映射效果,同一个曝光值也会被烘进可选的 PNG ZIP 里。

为什么我的 HDRI 被判定为不是 2:1 而被拒收?

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] 插槽——所以文件名和插槽名始终对得上。

HDR cubemap 应该用多大的面尺寸?

对 4K HDRI 来说,1024 px 是安全的默认值。Radiance 面图体积不小——一张 2048 的面压缩前大约 16 MB——只有源图高度足够时才值得选更大尺寸。

可以把 cubemap 面转换回等距柱状 HDRI 吗?

把六个面合并回一张 2:1 图片要用另一个工具,Cubemap 转全景图转换器。它只接受 8-bit 面图,所以要喂给它色调映射后导出的 PNG。