一、它是什么?
想象你站在一个正方体房间的正中间,房间 6 面墙(前、后、左、右、上、下)都贴满了照片,拍的是你四周的景色。
这时候不管你朝哪个方向看,视线都会落到某一面墙上,你看到的就是那面墙上对应位置的图案。
这就是立方体映射:
- 6 张图拼成一个盒子,叫立方体贴图(Cubemap)
- 查询时不用"坐标",只用一个方向
- 问的问题是:“朝这个方向看,能看到什么颜色?”
┌─────┐ │ 上 │ ┌─────┼─────┼─────┬─────┐ │ 左 │ 前 │ 右 │ 后 │ └─────┼─────┼─────┴─────┘ │ 下 │ └─────┘ 把盒子拆开平铺,就是这 6 张图二、为什么要用它?
因为游戏里有很多东西只和方向有关,和位置关系不大。
比如天空:你往前走 10 米,月亮还是在那个方向,天空看起来没变化。那就没必要真的建一个巨大的天空模型,只要记录"每个方向是什么颜色"就够了。
为什么偏偏用正方体而不用一张圆形或长方形图?
| 方案 | 问题 |
|---|---|
| 一张长方形全景图 | 头顶和脚下的图案会被拉扯变形,计算也慢 |
| 立方体 6 张图 | 变形小、计算快,显卡天生就支持 |
三、游戏里怎么用?(最重要的部分)
1. 天空盒 —— 最常见
游戏里那片看起来无边无际的天空、远山、星空,绝大多数就是一个立方体贴图。
两个小窍门:
- 天空跟着玩家走:玩家怎么移动都碰不到天边,所以看起来"无限远"
- 天空最后画:先画房子、角色,天空只填补剩下的空白,省性能
2. 反射 —— 让金属、水面、车漆"照出"周围
一辆车的车漆能映出周围的街道,并不是真的实时算出来的。做法是:
在车附近放一个"相机",朝 6 个方向各拍一张,拼成立方体贴图。
车身每个点,根据视线被反弹后的方向,去这张图里取颜色。
这个"拍照的东西"在 Unity 里叫反射探针(Reflection Probe),在场景里摆一下就能用。
眼睛 ──→ 车身 ──↗ 反弹方向 ↓ 去立方体贴图里查:这个方向是什么?→ 映出一栋楼粗糙程度怎么表现?
- 镜面、新车漆:用清晰的贴图 → 倒影清楚
- 磨砂金属、旧铁皮:用模糊版本的贴图 → 倒影糊成一片
3. 环境光 —— 让物体"染上"周围的颜色
在绿色森林里,角色身上会带点绿色;在沙漠里,会偏暖黄色。
做法类似:把周围环境的立方体贴图模糊到极致,只剩下"大概每个方向偏什么颜色",然后按物体表面的朝向去取色。朝上的面取天空的蓝,朝下的面取地面的绿。
4. 点光源阴影 —— 灯泡照向四面八方
一盏吊灯向所有方向发光,要算阴影,就得知道"每个方向上最近的东西有多远"。
于是从灯的位置朝 6 个方向各拍一张"距离图",拼成立方体贴图。判断某点是否在阴影里时,就查一下:灯往这个方向看,最近的东西是不是比这个点更近?是,就说明被挡住了。
5. 其他小用法
| 用途 | 说明 |
|---|---|
| 室内假窗户 | 窗外放一张房间的立方体贴图,看起来窗户里真有个房间,其实是平面(叫 Interior Mapping,城市建筑常用) |
| 卡通 / 风格化光照 | 用一张手绘的立方体贴图控制不同朝向的颜色 |
| 全景截图 | 游戏里的 360° 拍照模式 |
四、Unity 里怎么上手?
做天空盒(3 步):
- 下载一张全景图,导入后把
Texture Shape改成Cube - 新建材质,Shader 选
Skybox/Cubemap,把图拖进去 Window → Rendering → Lighting,把材质拖到Skybox Material
做反射:
- 场景里
GameObject → Light → Reflection Probe - 把它放在需要反射的区域中间,调整范围框
- 点击 Bake,金属材质就会自动映出周围环境
五、常见问题
| 现象 | 原因 | 解决 |
|---|---|---|
| 天空图案拼接处错位 | 6 张图方向摆错了 | 用全景图让 Unity 自动转换,别手动拼 |
| 反射里的东西位置不对,像"飘着" | 立方体贴图默认把周围当成无限远 | 反射探针里开启Box Projection,让室内反射贴合墙面 |
| 走进另一个房间,反射还是上个房间 | 只放了一个探针 | 每个区域放一个探针 |
| 实时反射很卡 | 每帧拍 6 张图太贵 | 改成烘焙,或者设为每帧只更新一个面 |
一句话总结
立方体映射 = 把"四周的样子"拍成 6 张照片围成盒子,之后只要给一个方向,就能查到那个方向的颜色。
用它做天空、做反射、做环境光、做点光源阴影,是游戏里最常用的基础技术之一。