TL

スクリーンスペース反射(SSR)

鏡やレイトレを使わず床や水面の映り込みを安価に足せる理由を、深度バッファを画面空間でレイマーチする原理から理解し、画面外が消える限界とキューブマップ併用の落としどころまで掴めます。

応用グラフィックス反射スクリーンスペースレイマーチング深度バッファキューブマップ最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.SSR は反射レイをワールドではなく画面空間でレイマーチし、進んだ位置の深度をGバッファの深度と比べて交差を探すため、追加のシーン構造なしに反射を描ける。
  • 2.反射先が画面に写っていない(画面外・別物体の裏・カメラ手前)情報は原理的に取得できず、映り込みが途中で消える。ここは事前計算のキューブマップへフォールバックして埋める。
  • 3.1テクセルずつ進む線形マーチは重く飛び越しやすいので、粗く進んで交差を跨いだら二分探索で詰める。ヒット境界のフェードと粗さに応じたぼかしで破綻を隠す。

SSR は「画面に写っているものだけ」を反射に使う

鏡面反射をリアルタイムで得る正攻法はレイトレーシングですが、反射のためだけにシーン全体へ光線を飛ばすのは高価です。スクリーンスペース反射(SSR、Screen-Space Reflections)は発想を切り替え、すでにレンダリング済みの画面(カラー・深度・法線)を再利用して反射を近似 します。反射先の色は「その方向に見えている表面の色」であり、それはたいてい今フレームの画面のどこかに描かれている——この仮定に賭けるのがSSRです。

前提となるのは、遅延レンダリングで用意される G バッファ です。各画素の深度・法線・(必要なら)粗さがそろっているので、反射レイの出発点(表面のワールド位置)も、面法線から求める反射方向も画面情報だけで復元できます。SSR は基本的にこのGバッファを入力とするポストプロセスで、フォワード/ディファードの区分やGバッファの中身は /graphics/forward-deferred-rendering/ を参照してください。反射方向 R は入射方向 V(表面からカメラへ向かうベクトルの逆)と法線 N から R = V - 2*(V dot N)*N で得られ、この式はシェーディングの鏡面反射と同じものです(/graphics/shading-models-phong-pbr/)。

画面空間でのレイマーチと深度交差判定

SSR の心臓部は レイマーチ(ray marching) です。反射レイに沿って少しずつ進み、各ステップで「今いる位置は、その画面座標に実際に写っている表面より奥か手前か」を深度バッファと比較して調べます。レイが表面の裏へ潜り込む瞬間(手前から奥へ深度が入れ替わる瞬間)が交差点です。

SSR レイマーチの骨子(概念):

  P0 = 表面のビュー空間位置      # 反射レイの原点
  R  = 反射方向(ビュー空間)
  ステップ幅 dt でレイを前進:
    Pi = P0 + t*R
    uv = Pi を投影して画面座標へ    # ビュー→クリップ→NDC→uv
    z_scene = 深度バッファ[uv] を線形深度へ復元
    z_ray   = Pi のビュー空間 z
    if z_ray が z_scene より奥に回り込んだ:
        → この区間で交差 → 精緻化して色を採取

ここで本質的なのは、幾何そのものと当たり判定しているのではなく、「深度バッファに刻まれた可視表面」とだけ交差している 点です。深度バッファは各画素で最前面の1表面しか持たないため、SSR が触れられるのは常に「カメラから見えている表面」に限られます。深度バッファの原理と、投影後の深度が 1/z 的に非線形へ歪む性質は /graphics/z-buffer-depth-testing/ が詳しく、SSR ではこの非線形性のせいで深度比較の許容差(厚み)を距離に応じて調整する必要が出てきます。

ビュー空間マーチとスクリーン空間マーチ

レイの刻み方には二系統あります。ビュー空間で等間隔に進める素朴な方法は実装が容易ですが、遠方ほど1ステップが画面上で潰れて標本が無駄になり、近傍では飛び越しが起きます。これを避けるのが DDA 的な スクリーン空間マーチ で、レイの始点と終点を先に画面座標へ投影し、画面上のピクセル格子に沿って歩幅を決めます。1テクセルにつき最大1回の深度読み出しで済み、標本密度が画面上で一定になるため、実務ではこちらが主流です。

交差の精緻化と「厚み」問題

粗いステップで交差区間を跨いだら、そのまま採色すると当たり位置が数ピクセルずれます。定石は 粗い線形マーチで区間を特定し、跨いだ2点の間を二分探索(バイナリサーチ)で数回詰める 二段構えです。全域を細かく刻むより桁違いに安く、精度も出ます。

二段階マーチ:

  [1] 粗いリニアマーチ
        大きめの dt で前進し、z_ray が z_scene を
        追い越した「跨いだ区間 [t_prev, t_hit]」を検出

  [2] バイナリサーチで精緻化
        区間を中点で二分し、中点が奥側か手前側かで
        半区間を選ぶ、を数回反復 → 交差点へ収束

厄介なのが 厚み(thickness)問題 です。深度バッファは表面の「手前の面」しか記録せず、その物体が奥行き方向にどれだけ厚いかは分かりません。レイが z_scene を追い越しただけでは「本当にその面の裏に当たった」のか「その面の背後の空洞を素通りしている」のか区別できません。そこで実装では 一定の厚みを仮定 し、z_rayz_scene を超えても差が厚みしきい値以内なら交差、それ以上奥なら物体の裏側を貫通したと見なして棄却します。しきい値が大きすぎると偽の映り込み、小さすぎると反射が途切れます。

Hi-Z マーチで空を飛ばす

1テクセルずつのマーチは、広い空や単純な床では膨大な空振りを生みます。これを縮めるのが Hierarchical-Z(Hi-Z)マーチ です。深度バッファのミップ(各レベルが下位2×2の最小・最大深度を保持)を使い、レイが確実に何にも当たらない粗いセルは1回のテストで大きく飛び越し、当たりそうな所だけ細かいレベルへ降りて追跡します。空間データ構造で光線の空振りを枝刈りする発想(/graphics/spatial-structures-bvh/)を、画面空間の深度ピラミッドで実現したものと言えます。

原理的限界 ── 画面に無い情報は反射できない

SSR の限界はすべて 「深度バッファに写っている表面しか参照できない」 という一点に帰着します。反射先が次のいずれかに該当すると、SSR は情報を持たず反射が欠落します。

欠落する状況なぜ起きるか画面上の見え方
画面外(視錐台の外)反射レイが uv 0..1 の外へ出る映り込みが画面端で切れて消える
手前の物体の裏深度バッファは最前面しか持たない遮蔽物の裏の像が抜け落ちる
カメラ背後の物体そもそも描画されていない背後の景色が水面等に映らない
視線と浅い角度レイが長く伸び画面外へ出やすい地平線付近の反射がぶつ切れになる

とくに グレージング角(面すれすれ)の反射 は反射レイが長距離を這うため画面外へ抜けやすく、SSR が最も破綻しやすい領域です。ここで反射をハードに打ち切ると縁がくっきり消えて不自然なので、実装では レイが画面端に近づくほど、また最大ステップ数に達したときほど、反射の寄与を滑らかにフェードアウト させて欠落を目立たなくします。反射レイがカメラの方(R が視線と逆向き)へ戻る場合も、その像は画面に無いので重みを落とすのが定石です。

キューブマップへのフォールバック

SSR が情報を持てない画素は、別手段で反射を埋める しかありません。実務での定番が、事前計算した キューブマップ(環境マップ)へのフォールバック です。シーンの代表点から6面へ周囲をレンダリングした立方体テクスチャを用意しておき、反射方向 R でサンプリングすれば、画面外や遮蔽の裏でも「もっともらしい環境の映り込み」を得られます。キューブマップは方向で引く一種のテクスチャで、粗さに応じてぼかしたミップを選ぶ扱いはミップマップと同じ考え方です(/graphics/texture-mapping-filtering/)。

反射色の合成(概念):

  ssr_color, ssr_valid = SSR をマーチして採取   # valid: 当たった信頼度
  env_color            = キューブマップ[R]        # フォールバック

  # SSR が当たった所は SSR、外れた所は環境マップへ滑らかに移行
  reflection = mix(env_color, ssr_color, ssr_valid)

ここで ssr_valid は 0/1 のスイッチではなく、画面端フェード・ステップ超過・後方反射などを掛け合わせた連続値にします。こうすると SSR が効く中央部と、キューブマップが受け持つ周縁部が段差なく繋がります。粗い面(roughness 大)ではそもそも鮮鋭な映り込みが不要なので、SSR を弱めて安価なキューブマップ主体にする、という品質・コストの切り分けも一般的です。

SSR は「補完」であって単体解ではない

プロダクションの反射は多段のフォールバックとして設計されます。おおむね「レイトレ反射(あれば)→ SSR → 局所キューブマップ(部屋ごとの反射プローブ)→ グローバルな空のキューブマップ」の順で、手前の手法が情報を持つ画素をそれが埋め、持てない画素を次段へ委ねます。SSR を単独で完璧にしようとせず、得意な範囲(画面内の中距離・低粗さ)だけ受け持たせ、残りをプローブに任せるのが破綻の少ない設計です。

粗い反射とノイズ ── サンプリングの視点

鏡のように滑らかな面なら反射方向は1本ですが、粗い面ではマイクロファセットの向きがばらつき、反射は円錐状に広がります(BRDF の視点は /graphics/shading-models-phong-pbr/)。SSR でこれを厳密にやるには、粗さに応じて反射方向を確率的に散らした複数レイをマーチして平均する必要があり、これは画面空間で行うモンテカルロ積分に他なりません。標本数が少ないとノイズが出るのはパストレーシングと同じ事情です(/graphics/path-tracing-global-illumination/)。

実時間では全画素で多数レイは重すぎるため、1〜数レイに抑え、空間・時間方向のフィルタでノイズを均す のが定石です。近傍画素の結果を粗さに応じてぼかし(粗いほど広く)、さらに前フレームの反射を再投影して蓄積する時間的手法で、少ない標本を「見た目上」滑らかに見せます。ここは標本不足を後処理で誤魔化す領域であり、SSR の品質は交差判定そのものより、このフィルタ設計に大きく左右されます。

試験・面接で問われる勘所

「SSR の原理と限界を述べよ」には、原理=反射レイを画面空間でレイマーチし各ステップの深度をGバッファ深度と比較して可視表面との交差を探す、限界=深度バッファに写っている最前面しか参照できないため画面外・遮蔽の裏・カメラ背後・グレージング角の情報が欠落する、と対で答えるのが要点です。「欠けをどう埋めるか」と問われたら、画面端フェードで滑らかに打ち切りつつ事前計算のキューブマップ(反射プローブ)へフォールバックする、と展開できると理解が伝わります。厚み問題(深度が最前面しか無いため物体の奥行きを仮定する)に触れられると加点されます。

まとめ

  • SSR は反射のためにシーンへ光線を飛ばす代わりに、描画済みの画面(カラー・深度・法線=Gバッファ)を再利用 して反射を近似するポストプロセスである。
  • 反射方向のレイを 画面空間でレイマーチし、各ステップの深度を 深度バッファと比較 して可視表面との交差を探す。粗い線形マーチ+二分探索で当たりを詰め、深度が最前面しか無いため 厚みを仮定 して裏抜けを棄却する。
  • 深度バッファは最前面1表面しか持たないため、画面外・遮蔽物の裏・カメラ背後・グレージング角 の反射は原理的に取得できず欠落する。画面端では滑らかにフェードして打ち切る。
  • 欠けた画素は事前計算した キューブマップ(反射プローブ)へフォールバック し、ssr_valid を連続値にして SSR と段差なく合成する。粗い面はキューブマップ主体で足りる。
  • 粗い反射は画面空間のモンテカルロ積分となりノイズが出るため、少数レイ+空間・時間フィルタで均す。SSR は単体解ではなく 多段フォールバックの一段 として設計するのが定石。

グラフィックス Article

スクリーンスペース反射(SSR)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

グラフィックス

比較で見る軸

難易度: advanced / カテゴリ: グラフィックス / タグ数: 6

導入後に効く点

反射先が画面に写っていない(画面外・別物体の裏・カメラ手前)情報は原理的に取得できず、映り込みが途中で消える。ここは事前計算のキューブマップへフォールバックして埋める。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
グラフィックス
タグ数
6

判断チェックリスト

  • 自社の用途が「グラフィックス / 反射」に近いか確認する。
  • 強みである「SSR は反射レイをワールドではなく画面空間でレイマーチし、進んだ位置の深度をGバッファの深度と比べて交差を探すため、追加のシーン構造なしに反射を描ける。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

グラフィックス反射スクリーンスペースレイマーチング深度バッファグラフィックス反射スクリーンスペース