HOME / 第 5 部分 · 3D 游戏开发 / 第 49 课
MODULE 5 · 3D 游戏开发
第 49 课 · 3D 灯光与阴影
🎯 本课学习目标
- 掌握三种 3D 灯光
- 配置阴影效果
- 理解灯光能量与颜色
灯光决定 3D 世界的「氛围」。本课掌握三种灯光的配置与阴影。
📖 详细教学步骤
三种灯光概念
| 灯光 | 特点 | 用途 |
|---|---|---|
| DirectionalLight3D | 平行光,覆盖整个场景 | 太阳、月亮(主光源) |
| OmniLight3D | 点光源,向四周辐射 | 灯泡、火焰、路灯 |
| SpotLight3D | 聚光灯,锥形照射 | 手电筒、舞台灯 |
添加太阳光实操
- 添加
DirectionalLight3D - 用旋转工具把它旋转到斜上方(约 45° 俯视)
- 场景立刻亮了
- Light Energy:能量(亮度),默认 1
- Light Color:光颜色(日落可调橙红)
开启阴影实操
- 选中 DirectionalLight3D → 检查器 Shadow Enabled 勾选
- 物体开始投下阴影,立体感大增
- 阴影太黑:Shadow Blur 调柔和
- 阴影锯齿:调高阴影分辨率(项目设置)
💡 阴影吃性能,移动端慎用多灯光阴影。
点光源与聚光灯实操
OmniLight3D:Light Energy 调亮度,Omni Range 调照射范围SpotLight3D:Spot Angle 锥角、Spot Attenuation 衰减- 火焰旁放 Omni 光 + 粒子,效果立现
用代码控制灯光代码
白天黑夜循环、开灯关灯:
GDSCRIPTextends Node3D
@onready var sun: DirectionalLight3D = $Sun
func _process(delta):
# 让太阳缓慢旋转模拟昼夜
sun.rotation_degrees.x += 5 * delta
func toggle_lights():
sun.visible = not sun.visible # 开关光
全局光照(进阶)进阶
想要光线在场景里反弹(更真实):
- 项目设置 → Rendering → Lights and Shadows → GI
- 用 LightmapGI 或 SDFGI 做全局光照
- 新手先掌握直接光 + 阴影即可
⚠️
加了灯还是黑?
检查 Light Energy 是否为 0、灯光是否被禁用(visible=false)、材质是否接受光。
⚠️
阴影闪烁/抖动?
调大 Shadow 的 Bias(偏移)或调阴影分辨率。
🧪 动手试一试
🏋️ 课后练习
搭一个小场景:太阳光 + 一盏路灯(Omni)+ 手电筒(Spot),让太阳缓慢旋转模拟昼夜。
三种灯光各就各位;sun.rotation_degrees.x += 5*delta。
💡
主光源(太阳)用 Directional,局部补光用 Omni,特殊造型用 Spot。
💡
阴影默认开启即可,太多光源阴影会卡。
🎓 本课小结
三种灯光各有用途:Directional 太阳、Omni 灯泡、Spot 手电筒;Shadow Enabled 出阴影;Light Energy 控制亮度、代码可动态控制。