はじめに
3Dゲームの品質を大きく左右する要素の一つがライティングです。特に「間接光」(壁や床から反射した光)を表現することで、シーンはぐっとリアルで深みのある見た目になります。
しかし、リアルタイムで複雑なライティング計算を行うのはGPU負荷が高いため、特にモバイルやVRでは難しい場合があります。この問題を解決するのがLightmapGIノードです。ライティング情報をテクスチャに事前計算して焼き込むことで、高品質かつ高速な照明を実現できます。
LightmapGIとは?
LightmapGIは、シーン内の照明情報をテクスチャに焼き込んで、リアルタイムで高品質・高速な間接照明を実現するノードです。GIは「Global Illumination(グローバルイルミネーション)」の略です。
たとえ: リアルタイムライティングを「毎フレーム計算する照明」とすると、LightmapGIは「あらかじめ計算済みの照明」です。映画の撮影でライティングをセットアップしたら、後はカメラを動かすだけ、というイメージです。
継承ツリー:
LightmapGI → VisualInstance3D → Node3D → Node
このノードを使うべき場面
- 静的な屋内シーン(家・ダンジョン・廃墟)の高品質ライティング
- 屋外のオープンワールドで太陽光と環境光を組み合わせたいとき
- モバイルデバイス向けに最適化したいとき
- コンソール・PCゲームで視覚品質を最大化したいとき
- VRゲームでパフォーマンスと品質を両立させたいとき
使わない場面:
- ライトが常に動く場面(プレイヤーが懐中電灯を持ち歩く等)
- 昼と夜を動的に切り替えるシーン(複数のLightmapセットが必要)

主なプロパティと機能
| プロパティ | 型 | 説明 |
|---|---|---|
| quality | enum | LOW / MEDIUM / HIGH / ULTRA。ベイク品質(高いほど時間がかかる) |
| bounces | int | 光の反射回数(1〜5回推奨)。多いほどリアルだが計算時間増加 |
| use_denoiser | bool | ベイク結果のノイズを除去するかどうか |
| bias | float | ライティングのバイアス値(通常0.0005〜0.001) |
| max_texture_size | int | ライトマップテクスチャの最大解像度(2048 / 4096 / 8192) |
| environment_mode | enum | DISABLED / INDOOR / OUTDOOR。シーンの環境タイプ |
基本的なLightmapGIセットアップの例:
extends Node3D
func _ready():
# LightmapGIノードを作成
var lightmap_gi = LightmapGI.new()
add_child(lightmap_gi)
# ベイク設定
lightmap_gi.quality = LightmapGI.QUALITY_HIGH
lightmap_gi.bounces = 3
lightmap_gi.use_denoiser = true
lightmap_gi.environment_mode = LightmapGI.ENVIRONMENT_MODE_OUTDOOR
# ライトマップテクスチャの解像度
lightmap_gi.max_texture_size = 4096
print("LightmapGI setup complete. Ready to bake.")
ベイク実行とLightmapProbeの配置例:
extends Node3D
func _ready():
# LightmapGIノードを配置
var lightmap_gi = LightmapGI.new()
lightmap_gi.quality = LightmapGI.QUALITY_HIGH
add_child(lightmap_gi)
# LightmapProbeを配置(動的オブジェクト用)
var probe = LightmapProbe.new()
probe.position = Vector3(5.0, 1.0, 5.0)
add_child(probe)
# エディター上でベイク実行後、自動的にLightmapが生成される
func _process(delta):
# ベイク状況の確認(エディター用)
if Input.is_action_just_pressed("ui_select"):
# Lightmapが設定されているかチェック
for child in get_children():
if child is MeshInstance3D:
var mesh_inst = child as MeshInstance3D
if mesh_inst.gi_mode == GeometryInstance3D.GI_MODE_BAKED:
print("Mesh has lightmap: ", child.name)

もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 説明 | 調整のポイント |
|---|---|---|
| quality | ベイク品質 | LOW=数分、MEDIUM=数十分、HIGH以上=数時間。プロジェクト規模に応じて選択 |
| bounces | 光の反射回数 | 1=直接光のみ、2〜3=間接光1回反射、4以上=複雑な環境 |
| use_denoiser | ノイズ除去 | オン=クリーンだがぼやける、オフ=ノイズあり。推奨:オン |
| max_texture_size | 解像度 | 2048=軽い、4096=標準、8192=高品質だがVRAM多用 |
| environment_mode | シーンタイプ | INDOOR=室内ライティング向け、OUTDOOR=屋外太陽光向け |
| gi_mode(MeshInstance3D) | メッシュのGI設定 | BAKED=ライトマップ焼き込み、DYNAMIC=動的計算、DISABLED=無効 |

ベイク実行の手順(エディター)
- シーンにLightmapGIノードを配置
- 静的メッシュのgi_modeを「BAKED」に設定
- オプション:LightmapProbeを配置(動的オブジェクト用)
- エディター上部メニュー → Scene → Bake Lightmaps をクリック
- 品質とbounces値を設定してベイク開始
- 処理完了後、Lightmapテクスチャが自動生成される
まとめ
LightmapGIは、事前計算でリアルタイムライティング品質を保ちながら、パフォーマンスを大幅に改善する強力なツールです。
- 静的シーンの高品質ライティングを事前焼き込みで実現
- quality / bounces 設定で品質と処理時間をトレードオフ
- LightmapProbeと組み合わせることで、動的オブジェクトも環境光の恩恵を受ける
次回は、3D空間の反射をキャプチャして金属や光沢面の映り込みを表現するReflectionProbeノードを解説します。環境の映り込みを使った高度なビジュアル表現の手法を学んでいきましょう。
シリーズ:Godot 4 ノード解説
001〜040:各種ノード
041以降:個別ノード解説
- 041〜050: 基本的なノード群
- 051〜060: 物理・キャラクター関連
- 061〜070: パーティクル・エフェクト
- 071〜075: ライティング基礎
- 076: MultiMeshInstance3D
- 077: Decal
- 078: FogVolume
- 079: LightmapGI(このページ)
- 080: ReflectionProbe
この記事はGodot 4.xをもとに執筆しています。


コメント