【Unity】Screen Space Reflections(反射)の使い方と効果【Post Processing】
- 2020.03.26
- PostProcessing
- ScreenSpaceReflection, Unity, ポストプロセシング

「Screen Space Reflectionsの使い方を知りたい!」
「Screen Space Reflectionsって名前からして反射っぽいけど合ってる?」
というあなたに、Screen Space Reflections(画面スペースの反射)の使い方と効果を解説します。
まずはこちらをご覧ください。画面右側にある水たまりに、光っている柱や画面奥の家が反射して写っています。
こちらはデフォルトのオブジェクトを使ったシーンに水たまりを配置したものです。水たまりに白い球やピンクの球が反射しています。
このように、地面や水面などに反射している様子を表現できるのが『Screen Space Reflections』の機能です。
現実感のある映像を作るためには、物体の像が反射して描画されるようにすると良いです。
環境
macOS 10.15 Catalina
Unity2019.2.9f1
Unity Hub 2.2.2
Post Processing 2.1.7
参考文献
公式のパッケージ解説
公式のバッケージ解説の方は英語で書かれていますが、自動翻訳すれば概要を掴みやすくなります。
Post-Processing(ポストプロセシング)とは
Post-Processing(ポストプロセシング)とは、画面に描画する前の画像に対して処理を行うことで、最終的に描画される画像の見栄えを良くする機能です。インスタのフィルターのようなイメージです。
ポストプロセシングの概要や導入方法については以下の記事で解説しているので、こちらもご参照ください。
この記事の中ではポストプロセシングが導入されている状態で進めていきます。
Screen Space Reflections(反射)とは
Screen Space Reflections(反射)は、地面や水面オブジェクトに対する反射を表現するエフェクトです。
カメラに映っているオブジェクトが、地面や水面のオブジェクトに反射している様子を描画してくれるので、より現実感のある映像になります。
描画する範囲をバッファに入れて、どんな感じで反射させるのかを計算する必要があるので、レンダリングパスを「Deferred(遅延)」に変更する必要があります。
反射する地面などは、Materialの設定で『Smoothness』を上げておく必要があります。『Smoothness』の値が低いと、ざらざらした面として扱われるので、現実と同じように反射している像が映らないようになります。
どんな効果が得られるか
像が反射する現実的な表現ができます。特に水面や水たまりで効果を発揮します。
影が映るだけでなく像が映ることで、より自然な映像に仕上がります。
Screen Space Reflections(反射)を追加する
「Screen Space Reflections」のエフェクトを追加する場合は、「Post Process Volume」のコンポーネントで [Add effect…] ボタンをクリックし、[Unity] -> [Screen-space reflections] を選択します。

ポストプロセシングを使うための設定は以下の記事をご覧くださいな。
レンダリングパスの変更
レンダリングパスが『Forward』になっている場合は、以下のように注意書きが表示されます。

Screen Space Reflectionsを使うために、レンダリングパスを『Deferred』に変更しましょう。設定を変更するために、[Edit] -> [Project Settings] から『Project Settings』のウィンドウを開きます。

『Graphics』タブを開きます。

Quality Settingsで使用しているTierで『Use Default』のチェックを外し、『Rendering Path』で [Deferred] を選択します。

レンダリングパスを『Deferred』に変更すると注意書きが消えます。これでScreen Space Reflectionsを使えるようになります。

Screen Space Reflectionsの設定項目
Screen Space Reflectionsの設定項目は以下のようになっています。Screen Space Reflectionsの左にあるチェックボックスを外すとエフェクトが適用されなくなります。チェックを外すと全体がグレーアウトされて設定値を変更できなくなるため、うっかり値を変更するのを防ぎたい時はこちらで。
また、右側にあるOn/Offのボタンで切り替えてもOKです。On/Offで切り替える時は値を変更できるので、エフェクトは表示しないけど値は変えておきたい、なんて時にはボタンで切り替えると良いでしょう。
設定値を変える場合は、各項目の左側にあるチェックを入れます。チェックを外した状態だとデフォルトの値が使用されます。

Preset
Preset(事前に設定された値)は、デフォルトで調整されている設定値を選択することができます。Presetで『Custom』を選択すると、『Maximum Iteration Count』、『Thickness』、『Resolution』の設定項目が表示されます。
綺麗に反射させたい時はこの『Custom』を選択して設定するのが良いのですが、その分パフォーマンスにも影響がでます。
公式のリファレンスだと家庭用ゲーム機だったら『Medium』を上限としてプリセットを使ってね、と書かれているので、ハイエンドPC向けのゲームなら『Custom』で調整、それ以外は『Medium』に設定しておくのが良いですね。
下の画像は『Medium』のサンプルです。シンプルに水面っぽさが出ているのでこれでもいいかもしれません。

Maximum Iteration Count
Presetで『Custom』を選択したときに表示されるMaximum Iteration Countはレイマーチングのステップ数を設定する項目です。レイマーチングはメッシュではなくて距離関数を使って描画する方法で、この値が大きいほど反射の回数が多くなります。
以下の例では、Maximum Iteration Countの値を変えています。上の画像が16、下の画像が128で、数が大きい方が反射している回数が多くなっています。言い方を変えるとちょっとぼやけたような感じですね。水面を表現する場合はこれくらいの方が自然な気もします。

Thickness
Presetで『Custom』を選択したときに表示されるThickness(厚み)は、レイマーチングで使われるレイ(光線)の太さを設定しています。
Thicknessの値が小さいと光線が細くなり、より細かい部分まで描画されます。ただし、その分パフォーマンスは重くなります。逆に値を大きくすると光線が太くなって詳細部分が描画されないものの、パフォーマンスは軽快です。
どこまで詳細に描画するかは画面を見ながら決めていくと良いでしょう。
Resolution
Presetで『Custom』を選択したときに表示されるResolution(解像度)では内部バッファのサイズを設定することができます。

『Downsampled』を選択するとバッファのサイズは小さくなりますが、パフォーマンスは上がります。『Supersampled』を選択すると見た目が綺麗になりますが、処理速度は遅くなります。『Supersampled』の場合はオブジェクトの形がきっちりと描画されている印象です。

Maximum March Distance
Maximum March Distance(レイマーチングの距離の最大値)は、反射を描画する距離を設定します。これはカメラからの距離を表していて、値を小さくすると奥側にあるオブジェクトの反射は描画されません。(光線の出発点はカメラ)
例えば『Maximum March Distance』の値を小さくすると、緑の球の手前まで反射が描画されますが、奥にあるピンクの球については反射が描画されていません。

あまり下げると上の画像のように不自然になるので、カメラに映る範囲を考えて調整すると良いでしょう。基本はデフォルトの『100』でも良いと思います。
Distance Fade
Distance Fade(フェードさせる距離)は、平面に近い部分の反射をフェードする距離を設定します。
以下の画像ではDistance Fadeの値を変化させたものを3つ並べています。Distance Fadeが0だと、ライトの反射が全体に影響していて、なんだかぼやけたような雰囲気にできます。Distance Fadeの値を増やしていくと、ライトの反射の影響はなくなって、ちょっとくっきりとした印象になります。
シーン内のオブジェクトの種類にもよりますが、全体としてふんわりした感じにするならDistance Fadeを下げて、はっきりめにしたいならDistance Fadeを上げると良いかも。
Vignette
Vignette(ビネット)は、画面端に近い反射を暗くする度合いを設定します。カメラの中央に映っているオブジェクトの反射は暗くなりませんが、カメラの端に映っているオブジェクトの反射は暗くなります。
以下の画像ではVignetteの値が0の画像と1.0の画像を並べています。Vignetteの値が大きくなると、画面の端に近いオブジェクトの反射が暗くなります。画像の例だと、左端にある緑色の柱が分かりやすいですね。画面中央のピンクの球の反射に対しては影響はありません。

水面などではきっちり反射するのではなく、若干暗くしたりぼやけた感じにしたいので、このVignetteを組み合わせてみましょう。
Screen Space Reflectionsのデモ
Screen Space Reflectionsの使用例をいくつか紹介します。
デフォルトのオブジェクト
設定値の項目でも使っていたデフォルトのオブジェクトでは以下のようになります。Presetとして『Medium』を選択しています。

水たまりのQuadを作る
以下のようにシンプルな水たまりの画像を用意して、Quadに表示させてみます。

水たまりのマテリアルではMetalicとSmoothnessを上げ、平面のマテリアルでSmoothnessを下げました。これにより、水たまりでのみ反射するようにしています。水たまりのマテリアルは『Rendering Mode』を [Cutout] にして透明な部分を表示しないようにしています。
水たまりのQuadの別パターン
夕暮れの町で水たまりを配置しました。雨上がりの雰囲気を出すのに良さそうです。
水たまりの下にある地面を透過させて表示したいところですが、Materialの『Rendering Mode』をFadeにすると反射を描画してくれないのでこのようにしています。
サンプルで使ったアセット
サンプルで使ったアセットも紹介します。もし同じ雰囲気で画面を作ってみたい場合は試してみてください。
屋外のサンプルとして使った村は『Village Exteriors Kit』を使っています。夕方の村は『Village Exteriors Kit』を使っています。同様に使ってみた感想やレビューについてはこちらの記事もご参照ください。
アセットストアはこちら。
村のライトや樽はこちら。
まとめ
Post-Processing(ポストプロセシング)のエフェクトのひとつであるScreen Space Reflections(画面スペースの反射)について使い方とデモを紹介しました。
地面や水面にオブジェクトの像が反射している様子を描画することで、より現実感のある映像を表現することができます。
ツルツルの床に反射している様子は使い勝手が良いのでいろいろな場面で使えます。
以下のページでポストプロセシングのエフェクト一覧をまとめてあるので、もしよかったらこちらもご参照ください。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】テクニックよりも本質を!ツールの使い方にとらわれない開発 2020.02.22
-
次の記事
SEからコンサル転職という道はありか?【開発者のキャリアパス】 2020.04.22
コメントを書く