1.光照核心概念
2.球谐光照简介
3.理解球谐函数种的法线方向
4.Unity中如何使用球谐光照
1.光照核心概念
1).直接光 vs 间接光直接光和间接光是最基础, 最物理的分类, 指的是光线的物理路径a.直接光: 从光源(如灯泡, 太阳)直接射到物体表面的光, 能量最强, 产生最亮的区域和最清晰的阴影b.间接光: 直接光照射到物体a后, 被a反射出去, 再去照亮物体b的光; 它是光的第二次, 第三次....乃至无数次的生命; 它负责填充阴影, 传递颜色(比如红墙旁的白球会泛红), 是真实感的灵魂c.关系: 直接光 + 间接光 = 完整的物理光照
2).局部光照 vs 全局光照局部光照和全局光照是不同的渲染策略a.局部光照- 理念: "只计算光源和当前物体表面的直接关系, 不管其他物体"- 工作方式: 对屏幕的每一个像素点, 只考虑:有哪些光源直接照射到了这个点, 这个点的材质属性(颜色, 光滑度)是什么, 然后根据简单的光照模型(如兰伯特漫反射 + 镜面高光)计算颜色- 优点: 计算速度极快- 缺点: 完全忽略间接光, 因此所有不被直接光照的地方都是死黑一片, 非常不真实- 好比: 你在一个大房间里, 只打开一个手电筒; 你只能看到手电筒光斑照亮的地方, 其他地方漆黑一团 b.全局光照- 理念: 我要模拟光线在场景中的真实传播, 包含所有的反射(间接光)- 工作方式: 它会考虑光线从光源发出, 如何在所有物体表面之间来回反弹, 最终形成我们看到的完整光照效果- 优点: 效果极其真实, 能自动产生柔和的阴影和逼真的色彩渗透- 缺点: 计算量巨大, 难以在游戏中实时运行(直到最几年硬件发展才逐渐实现)- 好比: 你打开了房间里的所有灯, 并且考虑到了光线从墙壁, 地板, 家具上的反弹, 整个房间明亮, 柔和, 自然- 全局光照 = 直接光照 + 间接光照的计算
3).环境光a.环境光是为了在局部光照模型下, 近似模拟间接光效果而发明的"作弊"方案b.为什么需要它? 因为全局光照虽好, 但太慢; 局部光照快, 但效果假; 想出折衷的方法: 我们不在物理上计算光线反弹,而是简单地给整个场景添加一个均匀的, 无处不在的基础亮度c.它不考虑光线从哪来, 只是简单地让所有物体, 包括那些在阴影里的物体, 都有一个基础亮度, 避免死黑; 由于简单的纯色环境光效果很差, 于是更聪明的方法(如球谐光照)被发明出来; 它让环境光不再是均匀的, 而是能根据位置和方向变化 从而更精确地模拟间接光d.环境光是对间接光的近似品, 主要用于局部光照渲染中
2.球谐光照简介
a.间接光, 环境光照, 球谐光照关系我们想省钱省力地做出逼真光影(间接光), 于是定了一个规矩叫"环境光"(环境光照), unity里最厉害的实现这个规矩的技术就叫球谐光照b.球谐光照是一种用少量数据(一组系数)来近似表示复杂环境光照的技术
通过一个实例来理解球谐光照: 你是一个音响师, 任务是用非常少的按钮, 模拟出一支庞大交响乐园的声音1).理解目标(复杂的原声)a.交响乐团(复杂环境光照): 一支完整的乐团有弦乐, 管乐, 打击乐等几十种乐器, 合奏时声音极其丰富, 层次感极强; 这就一张高清环境光照贴图, 记录了来自每一个方向的光线细节b.问题: 你无法把整个乐团随时带在身边(性能开销大)
2).找到方法(球谐的思路)你发明了一台超级合成器, 这台合成器的核心是:a.基础音色(球谐基函数): 它内置了9种最基础的声音模板(对应3阶球谐的9个系数), 比如:- 模板1: 一个均匀的"嗡嗡"声(代表整体基调)- 模板2: 一种"从左耳传到右耳"的移动感声音- 模板3: 一种"从脚底升到头顶"的移动感声音- ...还有几种简单的声场模板- 这些模板本身都很简单, 甚至不好听, 但它们是构建块b.采样的魔法(烘培)- 现在, 你带合成器去听一场交响乐(这就是烘培过程)- 你仔细聆听, 然后开始调节合成器上的9个按钮, 每个按钮控制一个基础模板的音量大小- 你不断地调试, 目标是: 让9个基础模板混合出来的声音, 尽可能接近真实交响乐的整体听感- 当你觉得"嗯, 有八成相似了"的时候, 你就记下了这9个按钮的位置(比如: 旋钮1 = 70%, 旋钮2 = 80% ...)- 这9个旋钮的位置就是球谐系数, 你成功将一场2小时交响乐的海量声音信息, 压缩成了9个系数
3).使用魔法(运行)a.现在, 我们需要为一部电影配乐了, 电影里有一个镜头, 演员在走路b.你不需要请整个乐团来现场演奏, 我们只需要:- 确定需求: 根据演员头部的朝向(法线方向), 你知道需要模拟出哪个方向的声音效果- 调用模板: 你的合成器内部已经知道, 在这个朝向下, 它的9个基础模板各自应该发出多大的声音- 混合: 之前记下了9个旋钮的位置(系数), 现在就把每个模板的声音, 按对应的旋钮位置(系数)进行放大或缩小, 就把所有结果混合在一起- 输出: 瞬间, 一个近似的交响乐声音就产生了, 并且会随着演员头部的转动而平滑变化c.效果如何- 优点: 你用9个数字就模拟出了交响乐的整体氛围、基调和大致走向; 成本极低, 速度极快- 缺点: 你肯定无法模拟出某一秒小提琴独奏的精细细节(高频信息), 你得到的是乐团整体的"感觉", 而不是精确的复制
3.理解球谐函数种的法线方向
1).我们上面的9种"基础音色模板", 它们的真面目其实就是9个数学函数, 每个函数都能根据你输入的方向(法线), 输出一个数值; 我们简化一下, 用3个模板(对应1阶球谐)来说明:a.模板0: 这是个常数函数, 无论你面朝哪里, 它的值都是1, 它代表均匀的基础亮度b.模板1: 它的值等于法线向量的y向量, 如果你法线朝正上方(y = 1), 它的值就是1; 朝正下方(y = -1), 值就是-1c.模板2: 它的值等于法线向量的z分量当我们给出一个法线方向时, 就同时为这3个模板设定了它们此刻的实时音量
2).将烘培好的系数与实时的模板音量结合a.现在, 我们有两组数据:- 烘培好的系数(旋钮位置): 系数0, 系数1, 系数2; 这是烘培时确定的, 在整个游戏过程是固定不变的, 它记录了从那个著名的交响乐团(复杂环境光)中提取出的, 模板0占多大比重, 模板1占多大比重- 实时计算出的模板音量(基函数值), 这是随着法线方向实时变化的b.最终的混合过程, 就是一个简单的加权求和:最终环境光颜色 = 系数0 * SH_0(法线) + 系数1 * SH_1(法线) + 系数2 * SH_2(法线) + ...c.将它放回音响师的例子- 系数就是记在笔记本上的"理想配比"(比如: 模板0占70%, 模板1占30%...)- 基函数值就是根据演员头部朝向, 从合成器上读取的当前各模板的实际音量(比如: 由于演员抬头了, 模板1的音量读数是0.8, 模板2的音量读数是0.2)- 最终声音 = 70% * 1.0 + 30% * 0.8 + 10% * 0.1
3.Unity中如何使用球谐光照