ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

揭秘虚拟世界真实感的魔法:光照系统

揭秘虚拟世界真实感的魔法:光照系统 引子一个想过但没深究的日常现象想象你打开一款3A游戏。**画面出现的那一刻——你被震撼了阳光透过窗户——在地板上投下斜斜的光斑金属剑刃——反射出冷冽的光泽主角的脸上——有明暗过渡的立体感树叶间——透出斑驳的光影**你沉浸在画面里——几乎相信这是真实的世界。但你有没有想过“为什么虚拟世界能看起来这么真实”屏幕上——不过是一堆彩色的像素点**物体——不过是一堆虚拟的三角形**是什么——让这堆虚拟数据看起来像真的一样**答案是——光照系统如果没有光照系统**所有物体都是平的——像剪纸一样没有明暗、没有阴影、没有反射像是没有阳光的白纸世界**——苍白、扁平、假有了光照系统物体有了立体感**场景有了氛围感**世界有了真实感**今天——就让我们深入了解这个让虚拟世界拥有真实感的伟大系统——光照系统——看看它到底是如何用数学模拟光线——让一堆像素变成栩栩如生的画面**。一、先问一个根本问题光是什么**要理解光照系统——先要理解光本身。在真实世界里光是从光源发出的能量**它以光子的形式四处飞散**遇到物体——要么被吸收、要么被反射、要么穿透**反射的光——跑到你眼睛里——你就看到了这个物体你能看到一朵红色的花——是因为阳光照到花上花吸收了大部分颜色的光只反射了红色的光红色的光进入你的眼睛你说“哦这朵花是红色的”在虚拟世界里我们没有真的光子我们只有数学公式****通过公式——模拟光是怎么和物体互动的算出这个像素应该是什么颜色光照系统的本质用数学近似模拟真实世界的光线传播。不需要100%真实——只要看起来像真的**——就够了二、光的三个角色光照系统里——光有三个主要角色角色1光源发光的家伙光源是发出光的东西太阳——方向光灯泡——点光源手电筒——聚光灯窗户透进来的光——面光源光源的属性位置在哪里方向往哪照颜色什么色的光强度多亮角色2物体被照的家伙物体是接收光的东西它的表面性质**决定了怎么反射光粗糙的木头——光散射到各个方向光滑的金属——光集中反射到一个方向红色的塑料——只反射红色物体的属性颜色本身什么色粗糙度表面平不平金属度是不是金属法线每个点朝哪角色3摄像机看的家伙摄像机是接收反射光的眼睛**在虚拟世界里——摄像机代替你的眼睛它站在某个位置朝某个方向看**看到什么颜色——就画到屏幕上光照系统的核心问题从光源出发的光照到物体上反射到摄像机里最终是什么颜色****光照系统的所有工作——都在回答这个问题。三、Unity里的四种光源**Unity提供了四种类型的光源——每种对应真实世界的一种光。光源1Directional Light方向光它像太阳**来自无限远所有光线平行****不管物体离得多远——接收到的光都一样强只有方向**、没有位置**位置在游戏里其实没意义用途模拟阳光、月光——照亮整个场景**光源2Point Light点光源它像灯泡**从一个点向四面八方**发光**越远——光越弱距离衰减有位置**、无方向**因为四面八方都照用途模拟灯泡、蜡烛、火把、宝石光芒光源3Spot Light聚光灯它像手电筒**从一个点朝一个方向**发光形成锥形**的光束**锥形之外——没有光有位置、有方向、有角度用途模拟手电筒、路灯、聚光效果光源4Area Light面光源它像窗户透进来的光**从一个平面**发出光光线柔和——不像点光源那么硬只支持烘焙**实时计算太贵用途模拟窗户光、LED灯板、柔和的室内光四、光照系统的经典公式Phong模型光照系统的核心——是一个个光照公式——用数学描述光如何照亮物体。最经典的公式——叫Phong模型——它把光照分成三部分**总光照 环境光 漫反射 高光部分1环境光Ambient**就算没有直接光照——物体也不该是全黑的真实世界里——光会四处乱弹**就算太阳没直接照到——墙上反射的光也能让物体不那么黑虚拟世界里——我们假装给一个基础亮度——这就是环境光公式ambient 物体颜色 × 环境光颜色 × 环境光强度效果保证物体永远不会完全变黑。部分2漫反射Diffuse**光照到粗糙表面——向各个方向散射像木头、纸张、皮肤这些粗糙的东西**光打上去——朝各个方向反射**不管你从哪个角度看——都差不多亮公式diffuse 物体颜色 × 光源颜色 × max(0, 法线·光方向)核心是法线·光方向点积法线正对**光——**点积1——最亮法线垂直**光——**点积0——不亮法线背对**光——**点积负数——**限制为0——不亮打个比方**想象一堵墙——**太阳正对着照它——最亮**同一堵墙——**太阳斜着照——没那么亮**同一堵墙——**太阳在背后——根本照不到这就是漫反射——“根据角度决定亮度”。部分3高光Specular**光照到光滑表面——集中反射到一个方向像金属、瓷器、水面这些光滑的东西光打上去——朝一个方向反射**只有从反射方向**看——才能看到刺眼的高光点公式specular 光源颜色 × pow(max(0, 反射方向·视线方向), 光滑度)核心是算出光的反射方向**看反射方向和视线方向**有多像**如果很像——高光点你正好看到了反射光**不像——看不到高光pow(..., 光滑度)光滑度越高——高光越集中**针尖一样的高光光滑度越低——高光越散**大片的柔光打个比方看镜子——能看到清晰的光源反射光滑度高看粗糙的塑料——只能看到模糊的一片亮光滑度低三部分合起来final ambient diffuse specular这就是Phong光照模型**——****“环境光漫反射高光”——几十年游戏光照的基石公式。五、Shader里怎么实现具体代码用Unity Shader写一份Phong光照——看看具体怎么做fixed4 frag(v2f i) : SV_Target { // 准备数据 fixed3 normal normalize(i.worldNormal); fixed3 lightDir normalize(_WorldSpaceLightPos0.xyz); fixed3 viewDir normalize(_WorldSpaceCameraPos - i.worldPos); fixed3 reflectDir reflect(-lightDir, normal); // 环境光 fixed3 ambient UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb; // 漫反射 fixed diff max(0, dot(normal, lightDir)); fixed3 diffuse _LightColor0.rgb * _Color.rgb * diff; // 高光 fixed spec pow(max(0, dot(reflectDir, viewDir)), _Shininess); fixed3 specular _LightColor0.rgb * _SpecColor.rgb * spec; // 总和 fixed3 finalColor ambient diffuse specular; return fixed4(finalColor, 1); }每一行都在做刚才讲的事**normal——**法线物体每个点朝哪**lightDir——**光的方向**viewDir——**看向摄像机的方向**reflectDir——**光的反射方向**diff dot(normal, lightDir)——**漫反射系数**spec pow(dot(reflectDir, viewDir), _Shininess)——**高光系数**几行代码——实现了几十年前科学家们发明的经典光照模型六、进阶PBR基于物理的渲染Phong模型是经典的近似——但它不够真实参数不直观**美术调光滑度没有物理意义不同灯光下——同一材质表现不一致**金属和非金属——难以区分现代游戏用PBR**Physically Based Rendering——基于物理的渲染。PBR的核心思路基于真实物理建模每种材质的属性——都对应真实物理量同一材质——在任何灯光下表现一致参数直观**——美术容易理解PBR的关键参数Albedo基础色物体本身的颜色不含任何光照Metallic金属度0——非金属塑料、木头、皮肤1——金属金、铜、铁Smoothness / Roughness光滑度/粗糙度越光滑——反射越集中镜面反射越粗糙——反射越散漫反射Normal Map法线贴图在平面上假装凹凸****不改变几何——但看起来有凹凸感AO环境光遮蔽模拟角落里比较暗的现象**让缝隙、凹处更暗——增加真实感PBR的公式PBR的公式复杂得多——包含微表面理论Microfacet Theory能量守恒反射出去的光不能超过入射光菲涅尔效应斜看物体反射更强法线分布函数GGX、Beckmann等具体公式不用记——只要知道**PBR用真实物理模拟——让画面更真实。Unity的Standard Shader**——就是PBR实现的代表。七、阴影光照系统的另一半光照系统不只是哪里亮——也要处理哪里暗——这就是阴影。阴影的原理从光的视角看世界**能看到的地方——**光能到达——被照亮**看不到的地方被挡住——**光到不了——阴影实现方式Shadow Map先从光的视角画一遍——记录每个方向上光最远看到哪里正式渲染时——对每个像素判断我在光的视线里吗**在——**光能到——照亮**不在——**被挡住了——阴影阴影和光照——是光照系统的双胞胎——一个负责亮、一个负责暗。八、全局光照让虚拟世界活起来上面讲的都是直接光照**——光源直接照到物体上。但真实世界还有间接光照****阳光照到红墙——红墙反射——旁边的白墙也带点红色**室内灯——**光在墙上多次反弹——填满整个房间这种光的多次反弹——就是全局光照Global IlluminationGI。GI的实现方式方式1光照贴图Lightmap提前烘焙**——把每个位置的间接光算好存到一张图里**游戏运行时——直接读——很快缺点只能用于静态物体**方式2反射探针Reflection Probe在场景里放几个探针每个探针记录周围的环境**反射时——从最近的探针取环境色方式3光照探针Light Probe在空间中撒一堆点每个点记录该位置的光照动态物体经过——从附近的探针采样光照方式4实时GISSGI、SDFGI等每帧实时算间接光画质好、性能贵现代高端游戏才用九、Unity光照系统的整体架构回头看Unity的整个光照系统——它是这样组织的层1光源Directional、Point、Spot、Area四种光源每盏灯的类型、颜色、强度、范围层2光照模型内置管线Phong、Blinn-Phong、LambertPBRStandard ShaderURP/HDRP更现代的PBR实现层3阴影系统Shadow Map级联阴影Cascaded Shadow Map软阴影PCF、PCSS层4全局光照光照贴图Lightmap反射探针Reflection Probe光照探针Light Probe层5后处理Bloom光晕——让高亮部分发光Tone Mapping色调映射——把HDR压到LDR色彩分级Color Grading——调整最终画面色调这五层——从光源到最终画面——共同组成了Unity的光照系统。十、光照系统的设计智慧**回顾整个光照系统——能提炼出几条深刻的智慧。智慧1分层近似真实光照是无穷复杂的——光的每一次弹射、每一次散射都要算。但游戏要实时**——60帧每秒——不可能全部精确算。光照系统的智慧分层近似**直接光照——**用简单公式Phong/PBR**间接光照——**用烘焙或探针**反射——**用反射探针**每一层——在性能和效果之间找平衡智慧2物理与艺术的结合PBR基于物理——但光照系统不完全遵循物理保留了艺术家的调节权**允许不真实但好看的效果是科学与艺术的完美结合智慧3预计算的力量**很多东西——提前算好光照贴图——烘焙反射探针——预烘焙Shadow Map——每帧生成但可复用“预计算换实时性能”——是图形学的核心智慧之一**。结语一场让虚拟世界拥有真实感的伟大魔法从光源的类型分类到Phong模型的经典公式到PBR的物理建模到阴影系统的深度接力到全局光照的间接反弹到后处理的画面升华——光照系统——是让虚拟世界看起来像真的的伟大魔法**它有四种光源**——模拟真实世界的各种光它有Phong与PBR**——用数学近似真实光线的行为它有阴影系统**——让暗处和亮处共存它有全局光照**——让间接光照亮每个角落它有后处理**——让画面焕发最终生机它像一场精妙的光的合奏光源——是乐器**Shader——是乐谱**阴影——是低音部**全局光照——是和声**后处理——是最后的润色**最终画面——是一首完整的视觉交响乐**它有Phong公式的经典之美**——几十年游戏都建立在这个基础上。它有PBR的物理严谨**——让每一份材质都经得起推敲。它有阴影系统的深度智慧**——用两次渲染实现哪里亮哪里暗。它有全局光照的层次丰富**——从烘焙到探针到实时。它有后处理的画面升华**——Bloom、Tone Mapping、色彩分级。下次当你看到游戏里的真实光照——请记得**那看似栩栩如生的画面——背后是一盏盏光源精心布置一份份Shader精细计算一次次Shadow Map严密比较一片片光照贴图默默烘焙一层层后处理最终润色每一道阳光**——都是Directional Light的方向光模拟**。每一份金属光泽**——都是PBR的微表面理论计算**。每一片阴影**——都是Shadow Map的深度比较结果**。每一处间接光**——都是Light Probe的空间采样贡献**。每一份画面氛围**——都是后处理的最终点睛**。这——就是光照系统的伟大它不只是让画面变亮而是让虚拟世界拥有真实感的完整体系**它不是一个简单公式而是从光源到最终画面的多层协作**它不是炫技的表面工程而是游戏画质飞跃的核心基石**在这份让虚拟世界拥有真实感的伟大魔法背后是几十年图形学研究的智慧沉淀**是数学、物理、艺术的深度融合**是性能与画质的精妙平衡**是用一堆公式模拟真实世界的科学奇迹**是让千万玩家沉浸在虚拟世界里的深情托底**这——就是光照系统真正的意义它是Unity画质的核心**它是游戏氛围的灵魂**它是3A画面的技术基石**它是每一位追求真实感的开发者都值得深入学习的必修知识**每一帧美到窒息的画面——都是光照系统默默付出的证明**。每一次沉浸在游戏世界里——都是光照系统默默营造的氛围**。每一位从了解光照到精通光照的开发者——都能创造属于自己的视觉奇迹。这——就是Unity光照系统送给整个游戏世界的、最伟大也最温柔的真实感礼物——它让虚拟世界活了起来——它让像素有了灵魂——它让代码变成了艺术。 ☀️✨
返回列表