見出し画像

"反射"を制して綺麗なワールドを!クオリティを上げるReflection Probeとは?

はじめに

ワールド製作初心者向け記事、今回は前回の記事で少し述べた、Reflection Probeについての記事です。

Reflection Probeは、個人的にはライティングに並ぶくらい見た目に影響するものだと考えているのですが、何故かVRChatのワールドではおざなりにされているワールドをしばしば見かけます。

Reflection Probeって何?ってなっているワールド製作者の方は是非この記事を読み終わったら、自分のワールドに試してみてください。きっと、『どうして自分は今までこの機能を知らなかったんだ……』と思うことでしょう。

そんなReflection Probeですが、意外と統合的な内容の記事がないので、私なりのテクニックを含めて解説したいと思います。
それでは参りましょう。

Reflection Probeとは?


私たちの身の周りにある金属やガラス物質を眺めたとき、そこには周りの景色が映りこんでいると思います。反射する物体に映り込む景色の情報を与えてくれるもの、それがReflection Probeです。

実はUnityでは、デフォルトの反射で使われる景色はSkyboxになっています。

つまりこれが意味することは、ワンルームなどの室内にある反射する物体にはSkyboxが映りこんでしまうということです。壁で遮蔽された空間において、これは非常に不自然ですよね?

Reflection Probe設定前。
これはあえて極端に設定した例ですが、室内でもデフォルトだとSkyboxが映ります。

Reflection Probeを設定することで初めて、反射に移りこむ景色を「上書き」することが出来ます。

Reflection Probe設定後。

Reflection Probeはキューブマップ(Cubemap)と呼ばれる特殊なテクスチャを生成して使います。キューブマップは6つの正方形テクスチャからできた、立方体の展開図のようなテクスチャで、非常に分かりやすく言うと上下前後左右それぞれの写真をカメラで撮って繋げたものとなっています。

キューブマップを使ってできた疑似的な立方体による風景は、境目を上手く処理することで球体のように見えるので、Skyboxなどにもキューブマップが利用されたりしています(だからSky”box”なのでしょうね)

上の画像で使われたキューブマップ
Texture shapeを2Dに変更すると6面あることが分かります

デフォルトの反射光設定変更

デフォルトの反射で使われている景色を変更する場所は、[Windws]→[Rendering]→[LightingSettings]のウィンドウの中にあるEnvironment Reflectionという項目です。

デフォルトはここのSourceがSkyboxになっているのですが、Customを選択することで独自のCubemapを使うことが出来ます。Intensity Multiplierは反射光の明るさで、0だと何も反射しませんので真っ黒になります。

後ほど説明しますが、Reflection Probeには範囲があり、範囲内の反射する景色をデフォルトのものから置き換えます。そのため、Customに設定して、何もCubemapをセットしないというのが、意図せぬ反射が無くて良いかもしれません(何も設定されていないと真っ黒になります。そのためきちんとReflection Probeで置き換えてあげる必要はありますが、黒色なので、置き換え忘れていても目立たないメリットがあります)

Shader側の設定項目

ここでは一般的なStandardシェーダーをもとに説明します。

MetallicとRoughnessはどちらもReflection Probeに関わりのあるパラメータです。

Metallicはそもそもの反射率に、Smoothness(ShaderによってはRoughness)は映り込むReflection Probeの粗さに関係してきます。このあたりの設定がきちんとされていないと、そもそも映り込まない(反射しない)ので注意が必要です。

このようにStandardシェーダーなどではReflection Probeが考慮されていますが、逆を言うとReflection Probeを一切考慮していないシェーダーもあります。全てのシェーダーがReflection Probeに対応しているわけではないので、こちらも注意する必要があります。

ちなみに、下の方にあるSpecular Highlightsのチェックを外すと光源の照り返しが、Reflectionsを切るとReflection Probeの影響がなくなります。

Reflection Probe側の設定

ではReflection Probe側の設定について説明しますが、全部説明するのも大変なので、最低限よく使う項目について説明します。

①上部のアイコン二つ
まず、一番上に3つの丸を線でつないだようなアイコンと上下左右矢印のアイコンがあると思います。

前者はReflection Probeの影響を受ける範囲を設定することが出来ます。これはあくまで影響を受ける範囲で撮影する範囲ではありません。直方体のそれぞれの面の真ん中にある点を押す・引っ張ることで、調整できます。

後者はCubemapを撮影する位置を設定することが出来ます。

ReflectionProbeのついたオブジェクトを移動させると、これら二つはその位置関係を保ったまま移動します。

②Type
次にTypeですが、RealtimeとBaked、そしてCustomがあります。

Realtimeは常に反射する景色用のCubemapを更新し続けるモードです。更新頻度はオプションで変更することが出来ますが、基本的にかなりの高頻度で更新し続けるため、結構な負荷になります(実質六個のカメラを常時撮影しているようなものなので……)
VRChatで運用されているケースを見ると、大体は超低解像度で運用されているのが一般的です。(余談:実装解説があるわけではないので、個人的な予想に過ぎないのですが、よつみフレームさんが出しているワールドの『ろうか』は、Reflection Probeの更新タイミングを自作のUdonで数秒に1回にしている、なかなか稀有な例なのではないかと思います)

BakedはあらかじめCubemapを計算しておいて、その情報を使うモードです。当然ながら事前に計算しておくので負荷的にはほとんどなく、高解像度でも問題ないため、VRCにおいて一般的に使われている方法になると思います。
Bakedでは、StaticフラグのReflection Probe Staticにチェックを入れたものがだけが映り込むため、映したいものはきちんとチェックを入れる必要があります。一つもチェックを入れていないとSkyboxだけが映りこんだ状態になります。
また、Bakeボタンを押し忘れていたり、BakeryでライトベイクしてReflection Probeのキューブマップがなくなっていたりすると、真っ黒になるので気を付けましょう。

Customは自分のCubemapを設定できるモードになります。ですが、このCustomにしかないDynamic Objectという項目が個人的に非常に便利なので、私はこのCustomしか使っていません。理由は後述したいと思います。

③Intensity
IntensityはCubemapの色強度です。この数値をいじることで、反射する景色の明るさを調整することが出来ます。

④Box Projection
Box Projectionは非常に重要な項目です。簡単に言うと私たちの視点の移動を考慮した反射をしてくれるようになります。条件として、Reflection Probeの影響範囲の領域を、私たちの移動範囲にピッタリと合わせる必要があります。

Box Projectionにチェックを入れていない場合、Reflecition Probeのキューブマップは撮影地点から見たものになっているため、私たちが撮影地点から離れると反射がずれていきます。室内などの狭い環境ではまずオンにしておいたほうが良いでしょう。

⑤Resolution
Resolutionは撮影するReflection Probeの解像度です。デフォルトの128は非常に低いため、基本的にはもうちょっと大きい値にしてあげるといいでしょう。

⑥Culling mask
Culling maskはレイヤーを使って、特定のオブジェクトだけ移したり・移さなかったりが出来ます。

⑦Clipping Plane
Clipping Planeは撮影される範囲を表していて、nearからfarの間を撮影する形となっていますので、その外側にあるオブジェクトは撮影されません。

CustomのDynamic Objectについて


TypeのBakedの説明でもしましたが、Bakedの時は各オブジェクトのStaticフラグの中のReflection Probe Staticにチェックを入れてないと、Reflection Probeにそのオブジェクトが映りません。

これをチマチマ設定してくのは非常にめんどくさいです。

そこでTypeをCustomにして、Dynamic Objectにチェックを入れ、Cubemapを設定しないままBakeします。Dynamic Objectにチェックを入れると、先述したStaticのチェックに関係なく、全てのオブジェクトを撮影してくれますので、Staticの設定が必要なくなります。

あとはClipping PlaneのFarを適切な値にしてあげるだけで、全てのオブジェクトを映してくれるでしょう。

もしあえて映したくないオブジェクトがあるときは、レイヤーで分けるか、一時的に非表示にしたうえでBakeするといいでしょう。

Reflection Probeの細かい制御方法

基本的にReflection Probeは影響を受ける範囲内に入ったオブジェクト全てに適応されます。しかしながら、ぴったりと密着した2つのオブジェクトで、それぞれ別の景色を反射してほしいときに微調整が難しいです。

こういうケースは、調整したいオブジェクトのMeshRendererのAnchor OverrideにReflection Probeのゲームオブジェクトを入れることで、そのReflection Probeの影響だけを受けるようになります。

したがって、大雑把な指定はReflection Probeで行い、細かく指定したい時はMeshRendererのAnchor Overrideを利用するといいでしょう。

一切影響を受けたくないオブジェクトは、Anchor Overrideの上にあるReflection ProbesのところでNoneを選んであげると、影響を受けなくなります。

ちなみに二つ以上のReflection Probeからの影響を受ける場合は、ブレンドされます。MeshRendererのAnchor Overrideの下に影響を受けているReflection Probe一覧と、その比重(Weight)が表示されているはずです。比重を調整したい時はReflection Probeのimportanceの値を変えてあげると、ブレンドの比重が変わります。

余談:Box Projectionの限界について

先ほどBox Projectionを設定してあげると、ズレ補正をしてくれるという話をしましたが、広大な範囲になってくると補正しきれなくなってきます。

広大なマップなどで、水面に地形が映り込む場合にBox Projectionを使うのはなかなか難しいです。

私はPlayerOnlyMirrorとレイヤーを駆使して、ミラーで反射させるという力業でやっていますが、もっといい方法があったら教えてください。
(プレイヤーがそこまで行けない前提なら、水面を境に逆さまのモデルを作るのもありかなと思います)

おわりに

というわけで今回はReflection Probeについての記事でした。

Reflection Probeについての記事は比較的多くあり、私がここで書いたほとんどのことは他の記事で網羅できる内容になっているのですが、関連してLighting SettingsのEnvironment Reflection項目についての解説をしてる記事はほとんどないので、書きました。

折角綺麗なワールドでも、反射がしっかりしていないとリアリティが下がってしまいます。まだ使ったことがない人は是非使ってみてください。

長文の読了、お疲れ様です。


この記事が気に入ったらサポートをしてみませんか?