Godot入門:LightmapGIの使い方と活用法

はじめに

3Dゲームの品質を大きく左右する要素の一つがライティングです。特に「間接光」(壁や床から反射した光)を表現することで、シーンはぐっとリアルで深みのある見た目になります。

しかし、リアルタイムで複雑なライティング計算を行うのはGPU負荷が高いため、特にモバイルやVRでは難しい場合があります。この問題を解決するのがLightmapGIノードです。ライティング情報をテクスチャに事前計算して焼き込むことで、高品質かつ高速な照明を実現できます。

LightmapGIとは?

LightmapGIは、シーン内の照明情報をテクスチャに焼き込んで、リアルタイムで高品質・高速な間接照明を実現するノードです。GIは「Global Illumination(グローバルイルミネーション)」の略です。

たとえ: リアルタイムライティングを「毎フレーム計算する照明」とすると、LightmapGIは「あらかじめ計算済みの照明」です。映画の撮影でライティングをセットアップしたら、後はカメラを動かすだけ、というイメージです。

継承ツリー:
LightmapGI → VisualInstance3D → Node3D → Node

このノードを使うべき場面

  • 静的な屋内シーン(家・ダンジョン・廃墟)の高品質ライティング
  • 屋外のオープンワールドで太陽光と環境光を組み合わせたいとき
  • モバイルデバイス向けに最適化したいとき
  • コンソール・PCゲームで視覚品質を最大化したいとき
  • VRゲームでパフォーマンスと品質を両立させたいとき

使わない場面:

  • ライトが常に動く場面(プレイヤーが懐中電灯を持ち歩く等)
  • 昼と夜を動的に切り替えるシーン(複数のLightmapセットが必要)




LightmapGIの効果
図1: ベイク前(リアルタイム計算)と後(焼き込み)のライティング品質向上

主なプロパティと機能

プロパティ 説明
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)




LightmapGIの品質設定
図2: 品質レベルが上がるほど詳細になり、処理時間も増加します

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

オン=クリーンだがぼやける、オフ=ノイズあり。推奨:オン
パラメータ 説明 調整のポイント
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=無効




LightmapProbeの配置例
図3: LightmapProbeを配置することで、動的オブジェクトも環境光の影響を受けます

ベイク実行の手順(エディター)

  1. シーンにLightmapGIノードを配置
  2. 静的メッシュのgi_modeを「BAKED」に設定
  3. オプション:LightmapProbeを配置(動的オブジェクト用)
  4. エディター上部メニュー → Scene → Bake Lightmaps をクリック
  5. 品質とbounces値を設定してベイク開始
  6. 処理完了後、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をもとに執筆しています。

コメント