HOME / 第 5 部分 · 3D 游戏开发 / 第 49 课
MODULE 5 · 3D 游戏开发

第 49 课 · 3D 灯光与阴影

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 5 部分 · 3D 游戏开发

🎯 本课学习目标

灯光决定 3D 世界的「氛围」。本课掌握三种灯光的配置与阴影。

📖 详细教学步骤

三种灯光概念

灯光特点用途
DirectionalLight3D平行光,覆盖整个场景太阳、月亮(主光源)
OmniLight3D点光源,向四周辐射灯泡、火焰、路灯
SpotLight3D聚光灯,锥形照射手电筒、舞台灯

添加太阳光实操

  1. 添加 DirectionalLight3D
  2. 用旋转工具把它旋转到斜上方(约 45° 俯视)
  3. 场景立刻亮了
  4. Light Energy:能量(亮度),默认 1
  5. Light Color:光颜色(日落可调橙红)

开启阴影实操

  1. 选中 DirectionalLight3D → 检查器 Shadow Enabled 勾选
  2. 物体开始投下阴影,立体感大增
  3. 阴影太黑:Shadow Blur 调柔和
  4. 阴影锯齿:调高阴影分辨率(项目设置)

💡 阴影吃性能,移动端慎用多灯光阴影。

点光源与聚光灯实操

  • OmniLight3D:Light Energy 调亮度,Omni Range 调照射范围
  • SpotLight3DSpot 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 控制亮度、代码可动态控制。