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

はじめに

3Dゲームで、磨かれた床に周囲が映り込む、金属製の武器に環境が反射する、ショーウィンドウのガラスに景色が映る、といった表現はプレイヤーの視覚的な没入感を大きく高めます。

しかし、リアルタイムで周囲全体の反射映像を計算するのはGPU負荷が非常に高いため、限定的にしか使えません。この問題に対応するのがReflectionProbeノードです。特定の空間の反射情報をキャプチャして反射マップ(EnvMap)として利用することで、効率的に高品質な反射表現を実現できます。

ReflectionProbeとは?

ReflectionProbeは、3D空間の周囲をキャプチャして反射マップを生成し、金属・光沢面の映り込み表現を効率化するノードです。

たとえ: ReflectionProbeを「鏡のボール」と考えてください。この球は周囲を映してEnvMapを作成し、その範囲内の金属オブジェクトに反射情報を提供します。複数のReflectionProbeを配置することで、シーン全体に多様な反射環境を実現できます。

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

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

  • 磨かれた床材に環境が映り込む表現
  • 金属製の武器・盾・装甲に光沢表現を加えたい
  • ショーウィンドウやガラス張りのインテリアシーン
  • 車や乗り物のボディに環境が映り込む表現
  • 水面(平坦な表面)に周囲が反射する表現

使わない場面:

  • 複雑に変形する液体の表面の反射(Screen Space Reflectionを使用)
  • リアルタイムで大きく動く環境(ReflectionProbeはスナップショット型)




ReflectionProbeの基本概念
図1: ReflectionProbeが周囲をキャプチャして反射マップを生成

主なプロパティと機能

プロパティ 説明
size Vector3 反射をキャプチャする範囲(立方体のサイズ X, Y, Z)
origin_offset Vector3 キャプチャ原点のオフセット。複雑な形状に対応
update_mode enum ONCE(静的・1度だけ)/ ALWAYS(毎フレーム・負荷大)
intensity float 反射の強さ(0.0〜1.0以上)
ambient_mode enum DISABLED / ENVIRONMENT / CUSTOM。環境光の取得方法
max_distance float 反射の影響距離(この距離以上離れると反射しない)
box_projection bool BOXプロジェクション有効化(複雑な形状に合わせた反射)
enable_shadows bool 反射に影を含めるかどうか
cull_mask int 反射に含める・除外するレイヤーを指定

基本的なReflectionProbeの配置例:


extends Node3D

func _ready():
	# ReflectionProbeを作成
	var reflection_probe = ReflectionProbe.new()
	add_child(reflection_probe)

	# キャプチャ範囲を設定(10x10x10の立方体)
	reflection_probe.size = Vector3(10.0, 10.0, 10.0)

	# 1度だけキャプチャ(静的シーン向け)
	reflection_probe.update_mode = ReflectionProbe.UPDATE_ONCE

	# 反射強度
	reflection_probe.intensity = 1.0

	# 反射が影響する距離
	reflection_probe.max_distance = 15.0

	# 位置
	reflection_probe.position = Vector3(0, 1.0, 0)

	print("ReflectionProbe created and positioned")

複雑な形状への対応(BOXプロジェクション):


extends Node3D

func _ready():
	var reflection_probe = ReflectionProbe.new()
	add_child(reflection_probe)

	# 廊下のような細長い空間に対応
	reflection_probe.size = Vector3(5.0, 3.0, 20.0)
	reflection_probe.update_mode = ReflectionProbe.UPDATE_ONCE

	# BOXプロジェクション有効化
	# (キャプチャした立方体の形状に従って反射を正確に配置)
	reflection_probe.box_projection = true

	# より複雑な形状には origin_offset で調整
	reflection_probe.origin_offset = Vector3(0, 1.5, 0)

	reflection_probe.intensity = 0.8
	reflection_probe.position = Vector3(0, 0, 0)




ReflectionProbeのサイズ設定
図2: ReflectionProbeのサイズと配置位置で反射の影響範囲が決まります

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

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

パラメータ 説明 調整のポイント
update_mode UPDATE_ONCE / UPDATE_ALWAYS 静的=ONCE(高速)、動的環境=ALWAYS(負荷大)
intensity 反射強度(0.0〜2.0) 0.5=控えめ、1.0=標準、1.5以上=鏡のように強い
max_distance 影響距離 小さいほどローカル、大きいほどグローバル影響
box_projection bool ON=複雑な形状向け、OFF=単純な球体キャプチャ
ambient_mode DISABLED / ENVIRONMENT / CUSTOM ENVIRONMENT=WorldEnvironmentから環境光を取得
enable_shadows bool ON=リアル、OFF=計算負荷軽減
size Vector3 シーンのスケールに合わせてXYZ調整。正立方体が基本




複数ReflectionProbeの配置例
図3: 複数のReflectionProbeを段階的に配置することで、滑らかな反射遷移を実現

複数のReflectionProbeをシーンに配置するコツ

高品質な反射表現を実現するには、複数のReflectionProbeを戦略的に配置することが重要です。


extends Node3D

func _ready():
	# 玄関エリア用
	var probe_entrance = ReflectionProbe.new()
	add_child(probe_entrance)
	probe_entrance.size = Vector3(5.0, 3.0, 5.0)
	probe_entrance.position = Vector3(0, 1.5, 0)
	probe_entrance.update_mode = ReflectionProbe.UPDATE_ONCE

	# リビングエリア用
	var probe_living = ReflectionProbe.new()
	add_child(probe_living)
	probe_living.size = Vector3(8.0, 3.0, 8.0)
	probe_living.position = Vector3(10.0, 1.5, 0)
	probe_living.update_mode = ReflectionProbe.UPDATE_ONCE

	# キッチンエリア用
	var probe_kitchen = ReflectionProbe.new()
	add_child(probe_kitchen)
	probe_kitchen.size = Vector3(6.0, 3.0, 4.0)
	probe_kitchen.position = Vector3(-5.0, 1.5, -5.0)
	probe_kitchen.update_mode = ReflectionProbe.UPDATE_ONCE

	print("3 ReflectionProbes created for different rooms")

まとめ

ReflectionProbeは、効率的に高品質な反射表現を実現し、金属や光沢面をリアルに描くノードです。

  • キャプチャした反射情報を各エリアで利用し、計算負荷を軽減
  • UPDATE_ONCE(静的)と UPDATE_ALWAYS(動的)で、シーンの特性に応じた使い分けが可能
  • 複数のProbeを段階的に配置することで、広いシーン全体に滑らかな反射環境を実現

次回からは、シェーダー入門としてVisualShaderを解説します。GPUプログラミングの基礎を学び、カスタムなマテリアル表現の世界へ一歩進みましょう。

シリーズ: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をもとに執筆しています。

コメント