Volume & atmosphere

God Rays / Light Shafts

ゴッドレイ

遮蔽物の隙間を通る光の筋を描く。

8 / 10

Interactive demo

Preparing the demo…

God Rays / Light Shafts

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

木々の葉の隙間、窓、雲の切れ間から差し込む光の筋(薄明光線)を描く表現です。ゲームでは、描画後の画面上で「太陽からの光が途中でさえぎられるかどうか」を、太陽の位置へ向かって放射状にぼかすことで安く近似する方法(画面空間のゴッドレイ、ライトシャフト)がよく使われます。逆光の森や廃墟、ステンドグラスの教会の演出に効果的です。

ゲームでの使いどころ

  • 逆光の風景:森の中の木漏れ日、朝日が昇る丘、ビルの間から差す夕日。
  • 神々しい演出:祭壇に差し込む光、ボスの登場、宝物が見つかる瞬間。
  • 屋内の雰囲気:窓から差し込む光の筋、ほこりっぽい倉庫、水中で水面から差し込む光。

しくみ

画面空間の方法(GPU Gems 3 で紹介された方法)は、次の 3 ステップです。

  1. 遮蔽マスクを描く:太陽(明るい部分)だけを白く、それをさえぎる物体を黒く描いた画像を作る。低解像度で十分。
  2. 太陽へ向かって放射状にぼかす:各画素から画面上の太陽の位置へ向かって、一定の間隔でマスクを NN 回読み、少しずつ減衰させながら足し合わせる。
rays(x)=1N∑i=0N−1decay i⋅mask(x−i Δ),Δ=x−xsunN\text{rays}(\mathbf{x}) = \frac{1}{N}\sum_{i=0}^{N-1} \text{decay}^{\,i}\cdot \text{mask}\big(\mathbf{x} - i\,\Delta\big),\qquad \Delta = \frac{\mathbf{x} - \mathbf{x}_{\text{sun}}}{N}
  1. 元の画面に加算する。

太陽と画素を結ぶ線の途中に物体(黒)があれば暗く、隙間(白)ばかりなら明るくなるので、隙間から放射状に伸びる光の筋が現れます。

ボリューメトリックとの違い:ボリューメトリックフォグは 3D 空間で光と影を計算するので、横から見た光の筋や、太陽が画面外にある場合も正しく描けます。画面空間のゴッドレイは、太陽が画面内(またはその近く)にあるときにしか使えませんが、非常に安く、見た目の効果が大きいのが利点です。

実装のポイント

  • マスクは低解像度で:マスクと放射状のぼかしは画面の半分〜4 分の 1 の解像度で十分です。
  • 太陽が画面外に出たら弱める:太陽が画面の外や後ろにあるときは、効果をフェードアウトさせないと、おかしな方向に筋が出ます。
  • 深度でマスクを作る:専用のマスクを描く代わりに、深度バッファで「空(最も遠い)か」を判定してマスクにする方法もあります。
  • 縞対策:サンプル数が少ないと、同心円状の縞が出ます。開始位置を画素ごとにずらす(ジッター)と細かいノイズに変わります。

つまずきやすい点

  • やりすぎ:強すぎる光の筋は画面全体を白っぽくし、他の情報を見えにくくします。演出の要所だけに使うのが効果的です。
  • 太陽が隠れると消える:画面空間の方法では、太陽が完全に物の陰に入ると筋も消えます。これは現実とほぼ同じ振る舞いですが、急に消えると不自然なので、変化をなめらかにします。
  • 横からの筋は描けない:光の筋を横から眺めるような構図には、ボリューメトリックな方法が必要です。

デモで試すこと

  1. 太陽がゆっくり動き、柱や木の隙間から光の筋が伸びます。太陽が柱の後ろに入ると、その柱の影が暗い筋として伸びます。
  2. 「遮蔽マスクを表示」をオンにすると、太陽だけが白く、その手前の物体が黒い、元になる画像が見えます。
  3. 「減衰」を下げると筋が短く、上げると長く伸びます。「サンプル数」を下げると、筋がざらついたり縞が出たりします。
  4. 「光の筋」をオフにすると、逆光の景色がのっぺりして見えることが分かります。

References

Unreal Engine Sky Atmosphere ↗

A general reference for this subcategory.