多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Godot 4 3D游戏光照实战:从环境光到全局光照的地牢场景搭建指南

Godot 4 3D游戏光照实战:从环境光到全局光照的地牢场景搭建指南 1. 先搞清楚 Godot 4 里 3D 光照到底要解决什么问题如果你刚开始用 Godot 4 做 3D 游戏尤其是像地牢爬行者这类场景第一个拦路虎往往不是代码而是光照。模型导进去一片漆黑或者颜色诡异这太常见了。很多人一上来就急着调参数结果越调越乱。这篇内容的核心就是帮你理清 Godot 4 里 3D 光照的底层逻辑。它不是简单地告诉你“这里加个灯”而是让你明白为什么加了灯还是不对以及在不同硬件和性能目标下该怎么选、怎么配。对于地牢这种封闭、多遮挡、需要氛围感的场景光照更是直接决定了游戏的“感觉”和性能开销。最关键的几个点环境光、直接光DirectionalLight, OmniLight, SpotLight、全局光照Global Illumination, GI以及它们背后的渲染后端Forward 与 Mobile。搞懂这些你才能让地牢的墙壁有正确的明暗让火把的光照范围自然并且保证在目标设备上能流畅运行。2. 环境准备与核心概念别急着拖灯光进来在动手摆弄任何一盏灯之前先把环境搭对。很多光照问题根源在于项目设置和世界环境没配好。2.1 项目渲染设置是地基打开 Godot 4进入项目设置 - 渲染。这里有两个关键选择直接影响所有光照效果和性能渲染器Forward还是Mobile。Forward功能最全支持所有高级光照特性如 SDFGI、VoxelGI适合 PC 和主机平台。如果你的地牢爬行者目标是桌面端就用它。Mobile为移动设备优化裁剪了很多高级特性以提升性能。如果你的目标是手机或 Web选这个。但要注意一些光照效果会受限。全局光照GI质量这里决定了环境间接光的质量。对于地牢场景我建议初期先设为“低”或“中”。因为地牢结构复杂高精度 GI 计算量很大先保证能跑起来再考虑优化质量。2.2 世界环境你的“天空”与全局光每个 3D 场景都有一个WorldEnvironment节点。它是光照的“画布”。选中它在检查器里找到Environment属性。背景模式地牢是室内场景通常不需要真实的天空。将Background Mode设为“Color”然后选一个深灰色或黑色作为纯色背景。这能避免天空盒的干扰让你更专注于人造光源。环境光这是最容易被忽略也最重要的设置。在Environment - Ambient Light里源Color。先不用Sky因为我们没天空盒。颜色不要用纯黑 (#000000)。纯黑意味着没有任何环境光那么所有没有被直接灯光照到的地方都会死黑一片非常不自然。地牢里即使是最暗的角落也有一丝微光。我一般会设为一个非常暗的蓝灰色或棕灰色比如#0a0a12或#1a1815。能量从0.05到0.2之间开始尝试。这个值决定了环境光的亮度。为什么先调这个因为环境光是场景的“底光”。它先给所有物体一个基础的、均匀的亮度。之后你加的每一盏直接灯都是在它的基础上进行“提亮”和“着色”。先把底光调到一个你觉得“最暗处也能勉强看清轮廓”的程度后续工作会简单很多。3. 三种直接光地牢里该怎么用调好环境光现在可以往场景里加“灯”了。Godot 4 主要有三种直接光对应地牢里不同的光源。3.1 DirectionalLight不适用于地牢的“太阳”DirectionalLight模拟无限远处的平行光比如太阳。它的光线是平行的没有衰减会照亮场景里所有面向它的表面。地牢适用性基本不用。地牢是封闭空间没有太阳。强行使用会导致光照非常平没有层次感且无法模拟局部光源如火把。如果你不小心加了立刻删掉或者把它的Energy调到0。地牢的光照应该由点光源和聚光灯主导。3.2 OmniLight你的火把与壁灯OmniLight是点光源像灯泡或火把光线向所有方向均匀发射。这是地牢里最常用的光源类型。关键参数解析范围 (Range)光能传播多远。地牢走廊里一个火把的Range可能在5到10米之间。不要设得太大否则性能浪费且不真实。衰减 (Attenuation)控制光线随距离减弱的速度。1.0是标准物理衰减。对于火把可以稍微调高一点比如1.2让光衰变更快营造出光线被潮湿空气吸收的感觉。能量 (Energy)光的亮度。初始值1.0可能太亮从0.8开始调整。颜色 (Color)火把光应该是暖色调。试试橙黄色比如#ffaa66。实操步骤在场景中创建一个OmniLight节点。把它移动到你觉得应该放火把的位置比如墙上的支架旁。调整Range和Attenuation让光晕范围看起来自然。调整Color和Energy让亮度符合预期。一个经验先单独看这盏灯的效果可以临时把环境光调暗确认它的范围、衰减、颜色是你想要的再把它融入到整体的环境光中。3.3 SpotLight探照灯与魔法光束SpotLight是聚光灯像手电筒或舞台追光。它有明确的方向和照射角度。关键参数解析范围 (Range)和衰减 (Attenuation)同OmniLight。角度 (Spot Angle)光束的锥形角度。地牢里守卫塔楼上的探照灯可以用30度左右的小角度一个照亮祭坛的魔法光球可能用60度。角度衰减 (Spot Attenuation)控制光束边缘的柔和度。值越大边缘越硬。通常1.0或更高可以产生清晰的圆形光斑。地牢应用场景墙上的壁灯如果它有灯罩光线是定向的。怪物或角色的手电/提灯需要脚本控制其旋转。特殊机关发出的光束。4. 全局光照与阴影让光线“弹跳”起来只有直接光你的地牢看起来会像用硬纸板搭的。因为现实中的光会反弹。墙壁被火把照亮后它自己也会微微发光照亮旁边的地面。这就是间接光在 Godot 里通过全局光照 (GI)实现。4.1 两种主要 GI 方式SDFGI 与 VoxelGIGodot 4 提供了几种 GI 方案对于地牢项目主要考虑两种SDFGI (Signed Distance Field Global Illumination)原理运行时动态计算质量高能处理动态物体和灯光。这是 Forward 渲染器下的默认推荐选项。怎么开在WorldEnvironment - Environment - GI下将GI Override设为SDFGI。关键设置Cascades级联数。地牢场景垂直空间变化大建议至少2。增加级联数能改善垂直方向的间接光质量但消耗也更大。Cell Size体素大小。值越小细节越多性能开销越大。地牢的墙壁和物体通常不需要极精细的 GI0.5或1.0可以作为一个起点。优点开箱即用适合大多数动态场景。缺点对性能有一定影响在低端硬件上可能需要关闭或降低质量。VoxelGI (Voxel Global Illumination)原理需要预烘焙Bake将光照信息存储到体素网格中。烘焙后运行时开销极低。怎么用在场景中添加一个VoxelGI节点然后点击顶部菜单的网格 - 烘焙光照。地牢适用性非常适合因为地牢通常是静态的几何结构墙壁、地板、固定装饰。一旦烘焙好光照效果固定但性能极佳。局限烘焙后灯光和移动物体不会产生动态间接光。如果你的火把是移动的或者有可开关的门改变了空间结构VoxelGI 就不适合。选择建议如果你的地牢完全是静态布局且追求高性能尤其是移动端用VoxelGI烘焙一次。如果你的地牢有动态光源移动的火把、闪烁的灯、爆炸效果或可破坏/移动的几何体用SDFGI。项目初期我建议先用SDFGI的低质量设置进行快速迭代确定光影感觉。性能优化阶段再考虑是否换用 VoxelGI 或进一步调整 SDFGI 参数。4.2 阴影有光必有影没有阴影的光照是没有灵魂的。Godot 中灯光默认不投射阴影需要手动开启。为灯光开启阴影选中你的OmniLight或SpotLight。在检查器中找到Shadow部分。勾选Enabled。阴影参数调整距离 (Max Distance)阴影能渲染多远。对于地牢火把设置得比灯的Range稍大一点即可。渐变 (Fade To): 阴影边缘的淡出距离让阴影消失得更自然。偏差 (Bias)极其重要用于解决阴影“悬浮”或“粘连”的渲染瑕疵阴影痤疮。如果看到阴影与物体表面有奇怪的条纹或分离微调这个值通常0.01到0.1之间。法线偏移 (Normal Bias)另一个解决阴影瑕疵的参数特别是对于大角度表面。可以和Bias配合调整。性能提示阴影是性能杀手尤其是软阴影和高分辨率阴影。对于远处或不重要的光源可以考虑关闭阴影。对于地牢中大量重复使用的壁灯确保它们的阴影设置是合理的不要过度。5. 性能优化与排查让地牢既好看又流畅光照是渲染开销的大头。下面是一些针对地牢场景的优化和问题排查思路。5.1 性能优化清单减少灯光数量这是最有效的优化。问自己这个角落真的需要一盏独立的灯吗能否用环境光或反射探针模拟能否合并几盏靠得很近的灯降低阴影质量在项目设置 - 渲染 - 光照与阴影中可以降低阴影的Filter Quality或者将Shadow Atlas Size调小如从4096降到2048。调整 GI 质量如果使用 SDFGI降低Cascades和Cell Size。如果使用 VoxelGI降低Subdiv级别。使用光照烘焙 (Lightmap)对于完全静态的物体和静态光烘焙光照到纹理上。这是移动端和大型静态场景的终极性能优化方案。Godot 4 的LightmapGI节点结合网格实例的GI Mode设置为Static可以实现。剔除 (Culling)确保相机的远裁剪平面 (Far) 设置合理不要渲染看不见的物体和灯光。Godot 会自动进行视锥剔除但过大的Far值会影响灯光影响范围的计算。5.2 常见问题排查问题场景一片漆黑。排查顺序检查WorldEnvironment节点是否存在Environment资源是否已赋值。检查Environment中的Ambient Light颜色和能量是否不为零。检查是否有任何DirectionalLight能量过高压过了其他光在地牢中最好禁用或删除它。检查你的OmniLight或SpotLight是否真的在场景中并且Energy 0。检查模型的材质是否太暗或有问题。问题光照闪烁或出现奇怪条纹阴影痤疮。解决调整灯光的Shadow - Bias和Normal Bias参数。一点点增加直到瑕疵消失。问题间接光GI效果不明显或更新慢。排查确认 GI 已启用SDFGI 或 VoxelGI。对于 SDFGI检查Cascades和Cell Size是否过于粗糙。尝试增加Cascades或减小Cell Size。SDFGI 需要几帧来收敛。等待一下或者轻微移动相机观察效果。确保物体的材质有足够的反射率非纯黑才能反弹光线。问题游戏运行很卡。排查打开调试器 - 监视器查看渲染 - 绘制调用和渲染 - 图元总数。光照和阴影会增加绘制调用。使用调试 - 可见碰撞体和调试 - 可见光照视图看看有多少灯光在生效。尝试逐一关闭灯光或阴影观察帧率变化找到性能瓶颈。6. 实战流程从零搭建地牢基础光照最后我们串起一个标准流程为你的地牢爬行者搭建第一版光照。项目初始化创建新 3D 场景。项目设置 - 渲染渲染器选Forward目标桌面或Mobile目标移动端。GI 质量先设为“低”。设置世界环境添加WorldEnvironment节点。配置Environment背景模式Color选深色。环境光源Color设一个暗蓝灰色 (#0a0a12)能量0.1。在GI部分覆盖为SDFGI。Cascades 设2Cell Size 设1.0。布置关键光源入口处壁灯添加一个OmniLight。颜色#ffaa66能量0.8范围6衰减1.2。开启阴影调整 Bias 消除瑕疵。复制几个放置在走廊两侧。中央大厅吊灯添加一个OmniLight范围更大 (10)能量更高 (1.0)放置在高处。宝箱上的魔法光球添加一个SpotLight。颜色#66aaff冷色能量1.2范围8角度45角度衰减2.0。让它从上方向下照射宝箱。烘焙静态光照可选性能优化如果你的墙壁、地板是静态的StaticBody3D或MeshInstance3D选中它们在检查器GeometryInstance部分将GI Mode设置为Static。删除 SDFGI 设置改为添加VoxelGI节点。点击顶部菜单网格 - 烘焙光照。等待烘焙完成。此时静态物体的光照信息被“烤”进了纹理运行时不再计算动态 GI性能大幅提升。但动态物体和动态光没有间接光效果。测试与迭代运行游戏在场景中移动。观察不同区域的明暗过渡是否自然阴影是否有瑕疵帧率是否达标。根据观察结果回头调整灯光的参数、数量或 GI 的设置。记住光照是艺术也是技术。不要追求一次到位。先建立一个全局正确的基础环境光GI再添加和调整局部光源直接光最后才是精细的微调和性能打磨。对于地牢爬行者那种幽深、神秘、偶尔被温暖火光照亮的氛围正是通过这一层层的光影叠加塑造出来的。
返回列表