news 2026/8/24 4:57:01

Lightmap 存的到底是什么?从“白衣服在红灯下变红“说起

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lightmap 存的到底是什么?从“白衣服在红灯下变红“说起

一个你可能从没想过的问题

先别急着聊技术。我问你一个生活里的问题:

一件白色的衬衫,是什么颜色的?

你大概会说"白色啊"。但真的是这样吗?

白衬衫 + 正常日光 → 你看到白色 白衬衫 + 昏暗房间 → 你看到灰色 白衬衫 + KTV红灯 → 你看到红色 白衬衫 + 全黑房间 → 你什么都看不到(黑色)

同一件白衬衫,在不同的光下,你看到的颜色完全不同。

这引出一个反直觉、但极其重要的事实:

你眼睛看到的颜色,从来都不是物体本身的颜色。
你看到的 = 物体本色 和 光 一起决定的结果。

理解了这句话,你就理解了游戏引擎里 Lightmap 的一切。这篇文章就从这里出发,把三个问题讲透:

  1. Lightmap 到底存的是什么?
  2. 为什么最终画面是"本色 × 光",而且是乘法
  3. Lightmap 里的光又是从哪来的?

一、Lightmap 存的是"光",不是"颜色"

先给结论:

Lightmap 存的是"这个点收到了多少光",不是物体是什么颜色。

这是最容易搞混的地方。一个游戏物体最终显示出来的样子,其实是两样东西合成的,它们必须分清楚:

最终画面颜色 = 物体本色 × 收到的光 └────┬────┘ └───┬───┘ 颜色贴图 Lightmap (Albedo) (光照信息) 美术画的 烘焙算的

拿一面白墙举例:

存的是什么白墙的值
颜色贴图(Albedo)物体本身是什么颜色全白,均匀一片
Lightmap它每个位置收到多少光靠灯近的亮,墙角暗

画出来是这样:

白墙本色(颜色贴图): ┌──────────┐ 到处都白,没有明暗 │██████████│ └──────────┘ Lightmap(光照): ┌──────────┐ 只记录哪亮哪暗 │▓▓▒▒░░▒▒▓▓│ 中间亮、墙角暗 └──────────┘ 两张一乘 = 你看到的画面: ┌──────────┐ 白墙上有了明暗立体感 │▓▓▒▒░░▒▒▓▓│ └──────────┘

注意:Lightmap 里根本没有"这墙是白的"这个信息。它只管"哪里亮、哪里暗"。墙是什么颜色,是颜色贴图的事。两者各管一摊。


二、为什么是"相乘",而不是"相加"?

这是全文最关键的一点。为什么最终颜色是本色乘以光,而不是加上光?

答案是:物体的"本色",本质上是一个"反射比例"。

想想物体为什么有颜色——因为它反射一部分光、吸收一部分光

白色 = 1.0 = 收到的光 100% 反射出去 灰色 = 0.5 = 收到的光 只反射 50% 黑色 = 0.0 = 收到的光 全部吸收,一点不反射

所以物体本色其实是个"折扣率",它作用在光上面:

你看到的亮度 = 收到多少光 × 反射出去的比例 = 光 × 本色

这就是为什么是乘法——本色是个比例,比例当然是用乘的。

用具体数字感受一下(光强用 0~1 表示):

白墙(本色1.0) 被强光(0.9)照: 0.9 × 1.0 = 0.9 → 明亮的白 白墙(本色1.0) 在墙角(0.2): 0.2 × 1.0 = 0.2 → 暗灰 黑墙(本色0.1) 被强光(0.9)照: 0.9 × 0.1 = 0.09 → 依然很暗

看最后一行:黑墙就算被强光直射,也亮不起来——因为它本色低,把光大都吸收了。这种效果只有乘法能表达,用加法就完全错了(加法会让黑墙被照亮变灰,不符合现实)。


三、彩色的情况:为什么白衬衫在红灯下会变红

上面是灰度,现在加上颜色。颜色是 (红, 绿, 蓝) 三个通道,相乘就是三个通道各乘各的

我们来解释开头那个"白衬衫在红灯下变红":

白衬衫 在 红灯 下

衬衫本色 = (1.0, 1.0, 1.0) ← 白:红绿蓝都 100% 反射 红灯 = (1.0, 0.0, 0.0) ← 红光:只有红,没有绿蓝 各通道相乘: 红:1.0 × 1.0 = 1.0 ✓ 有红光,衬衫也反射红 绿:1.0 × 0.0 = 0.0 ✗ 没有绿光可反射 蓝:1.0 × 0.0 = 0.0 ✗ 没有蓝光可反射 结果 = (1.0, 0, 0) = 红色 ✓

白衬衫在红灯下变红——不是衬衫变了,是它老老实实反射了唯一存在的红光。公式自动算对了。

再看一个更反直觉的:

红苹果 在 绿灯 下

苹果本色 = (1.0, 0.0, 0.0) ← 红:只反射红光 绿灯 = (0.0, 1.0, 0.0) ← 只有绿光 相乘: 红:1.0 × 0.0 = 0 ← 苹果想反射红,但环境里根本没红光! 绿:0.0 × 1.0 = 0 ← 有绿光,但苹果不反射绿(吸收掉) 蓝:0.0 × 0.0 = 0 结果 = (0, 0, 0) = 全黑!

红苹果在纯绿光下会变成黑色——这是真实的物理现象,你在实验室里能验证。而这个"本色 × 光"的公式,天然就把它算对了。


四、那 Lightmap 里的光,是从哪来的?

既然 Lightmap 存的是光,那这些光是哪来的?只有三个来源:

① 直接光——来自光源本身

太阳、灯泡,直接照过来的光。这个好理解。

② 间接光(弹射光)——来自其他表面

光打到墙上,墙会把一部分光反射出去,照亮旁边的东西。

灯 → 照亮地面 → 地面反射 → 照亮墙 → 墙再反射 → 照亮天花板 ...

这才是 Lightmap 最有价值的部分。因为间接光要追踪光线反复弹射,实时算太贵,所以提前烤进 Lightmap 最划算。

也正是间接光,解释了为什么 Lightmap 图片常常是彩色的——

插一句:为什么 Lightmap 本身是彩色的?

你如果见过 Lightmap 贴图,会发现它花花绿绿的,可能会疑惑:不是说它只存"光有多强"吗,怎么有颜色?

因为——光本身是有颜色的。

白灯照过来 → Lightmap 存白光 红霓虹灯照过来 → Lightmap 存红光 光打在红墙上弹过来 → 弹过来的光带红色!(间接光染色)

所以一面白墙如果旁边有面红墙,白墙靠近红墙的部分,在 Lightmap 里会是淡红色——因为它收到了红墙反射来的红光。

这里要再次强调那个致命的区别:

颜色贴图里的红 = "这个物体表面是红色的" Lightmap 里的红 = "有红色的光照到了这里"

两个红,完全是两回事。

③ 环境光/天空光——来自天空

光线没撞到任何物体、飞向天空的部分,会收到天空的光(比如白天蓝天的淡蓝色光)。

三者加起来,就是 Lightmap 里存的总光照:

Lightmap 存的光 = 直接光 + 间接光 + 天空光 (光源) (弹射) (天空)

五、为什么非要分开存?合并成一张不好吗?

你可能会问:既然最终是"本色 × 光",那我直接把它俩乘好,存成一张最终图片不就完了,何必分两张?

因为分开存能省下惊人的内存

如果合并存(本色×光 存成最终图): 一张墙的贴图本来能重复用在场景里 100 面墙上, 但每面墙的光照不同 → 只能给每面墙各存一张独立的最终图 → 100 张高清图 → 内存爆炸 💥 分开存(颜色一张 + 光一张): 颜色贴图:100 面墙共用同一张(本色都一样) Lightmap:只存各自的明暗,而且可以用很低的分辨率 → 内存省下一大截 ✓

而且还有个巧妙之处:光是平滑变化的(明暗过渡很缓,没有细碎纹理),所以 Lightmap 可以用很低的分辨率,放大了也不糊。而颜色贴图有细节花纹,需要高分辨率。分开存,就能各用各合适的精度,一点不浪费。


总结

用一张表收尾全文:

问题答案
Lightmap 存的是颜色吗?不是。存的是"这个点收到多少光"(光照信息)
为什么它是彩色的?因为光本身有颜色(红灯、红墙反射的红光)
光从哪来?① 直接光(光源)② 间接光(表面弹射)③ 天空光
物体本身颜色谁管?颜色贴图(Albedo),和 Lightmap 是两码事
最终画面怎么算?本色 × 收到的光(逐像素、逐 RGB 相乘)
为什么用乘法?因为本色是"反射比例",比例作用在光上就是乘
为什么分开存?颜色可共用、光可低分辨率,省内存

如果整篇文章只留一句话,那就是:

你看到的颜色,从来不是物体本身的颜色,而是"物体能反射的颜色"和"照过来的光"相乘的结果。颜色贴图管前者,Lightmap 管后者,两张图一乘,才是你在游戏里看到的画面。

全黑房间里,再白的墙也是黑的 (光=0,乘出来=0) 纯绿光下,再红的苹果也不红 (本色和光对不上,乘出来=0)

这,就是 Lightmap 的本质。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 4:55:30

基于Coze平台构建多智能体协作系统:从概念到实战部署

最近在尝试将AI能力集成到团队协作流程中,发现单点智能工具往往“各自为战”,难以形成合力。直到深入体验了Coze平台的多智能体(Multi-Agent)协作功能,才真正找到了构建“AI团队”的钥匙。本文将从一个完整的项目实战出…

作者头像 李华
网站建设 2026/8/24 4:54:36

Atmosphere崩溃0x4A8怎么解决:RetroArch闪退的完整排障指南

Atmosphere崩溃0x4A8怎么解决:RetroArch闪退的完整排障指南 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 在 Nintendo Switch…

作者头像 李华
网站建设 2026/8/24 4:53:21

大模型技术面试核心:MoE、量化与部署实战

1. 大模型技术面试全景解析2026年的大模型技术领域已经形成了完整的技能矩阵,头部企业的面试题库普遍聚焦四大核心模块:混合专家系统(MoE)、模型量化、生产部署和训练优化。我在最近三个月密集面试了多家头部AI实验室和科技大厂&a…

作者头像 李华
网站建设 2026/8/24 4:50:49

闲鱼虚拟商品项目拆解:零成本投屏软件变现全流程

最近在整理一些副业项目时,发现一个很有意思的现象:很多看似简单的需求,背后其实隐藏着巨大的流量和变现机会。比如,在闲鱼这样的二手交易平台上,用户对“投屏”的需求就非常旺盛。无论是想把手机视频投到电视上看&…

作者头像 李华
网站建设 2026/8/24 4:48:16

C#类型转换全解析:从隐式到显式,避坑指南与实战应用

1. 从“类型不匹配”的编译错误说起如果你刚开始写C#,大概率已经见过这个老朋友了:CS0029: Cannot implicitly convert type ‘A’ to type ‘B’。编译器用这条冰冷的错误信息告诉你,你试图把一个苹果放进一个标注为“只能装橘子”的篮子里。…

作者头像 李华
网站建设 2026/8/24 4:47:44

SpringBoot集成JWT实现无状态登录认证:从原理到实战避坑指南

1. 项目概述与核心价值 最近在重构一个老的后台管理系统,用户登录认证这块一直用的是传统的Session-Cookie方案。随着微服务拆分和前后端分离架构的普及,每次请求都要带着Session ID去查Redis,不仅增加了网络开销,在跨域、分布式…

作者头像 李华