はじめに
3Dゲームで、磨かれた床に周囲が映り込む、金属製の武器に環境が反射する、ショーウィンドウのガラスに景色が映る、といった表現はプレイヤーの視覚的な没入感を大きく高めます。
しかし、リアルタイムで周囲全体の反射映像を計算するのはGPU負荷が非常に高いため、限定的にしか使えません。この問題に対応するのがReflectionProbeノードです。特定の空間の反射情報をキャプチャして反射マップ(EnvMap)として利用することで、効率的に高品質な反射表現を実現できます。
ReflectionProbeとは?
ReflectionProbeは、3D空間の周囲をキャプチャして反射マップを生成し、金属・光沢面の映り込み表現を効率化するノードです。
たとえ: ReflectionProbeを「鏡のボール」と考えてください。この球は周囲を映してEnvMapを作成し、その範囲内の金属オブジェクトに反射情報を提供します。複数のReflectionProbeを配置することで、シーン全体に多様な反射環境を実現できます。
継承ツリー:
ReflectionProbe → VisualInstance3D → Node3D → Node
このノードを使うべき場面
- 磨かれた床材に環境が映り込む表現
- 金属製の武器・盾・装甲に光沢表現を加えたい
- ショーウィンドウやガラス張りのインテリアシーン
- 車や乗り物のボディに環境が映り込む表現
- 水面(平坦な表面)に周囲が反射する表現
使わない場面:
- 複雑に変形する液体の表面の反射(Screen Space Reflectionを使用)
- リアルタイムで大きく動く環境(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)

もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 説明 | 調整のポイント |
|---|---|---|
| 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をシーンに配置するコツ
高品質な反射表現を実現するには、複数の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をもとに執筆しています。


コメント