反射
Reflection Probe
リアルタイム生成ではなく必ずベイクする(ボケ反射に品質の差が出る)
相互反射 ( Interreflections )
ボックスプロジェクション ( Box projection )
Reflection Probeを使ったときに近くにあるオブジェクトの映り込み方がおかしくなるのを補正する
Edit > Project Settings > GraphicsからReflection Probes Box Projection を有効にしておく
ブレンド
Reflection Probeを二つ作って効果範囲を重ねると、重なった部分は二つのキューブマップがシェーダに渡されて反射結果がブレンドされます。
有効にするためには前節のBox ProjectionのようにGraphics SettingsからReflection Probes BlendingをONする必要があります。
また、RendererのReflection ProbesをBlend Probesにする必要があります。
カリングマスク
通常のカメラの性能を向上させる標準的な方法は、Culling Mask プロパティーを使用して重要でないオブジェクトをレンダリングしないようにします。この方法はリフレクションプローブに対しても同様に有効です。例えば、シーンに多数の小さなオブジェクト (岩や植物など) が含まれている場合は、それらをすべて同じレイヤーに配置し、カリングマスクを使用して、リフレクションにレンダリングすることを避けます。
リアルタイムのプローブの最適化
Refresh Mode
Refresh Mode によって、いつプローブを更新するかを選択できます。処理時間的にもっともリソースに負担がかかるのは、Every Frame です。このオプションは、少ないプログラムの手間で、もっとも頻繁に更新できます。ただし、すべてのプローブにこのモードを使うとパフォーマンス上の問題が発生する場合があります。
モードを On Awake に設定すると、プローブはランタイムに更新されますが、シーンの開始時に 1 回だけです。これは、シーンがランタイムに設定される場合は有用です。しかし、生存期間中に変更することはできません。
最後の Via Scripting では、スクリプトでプローブの更新を制御できます。スクリプトのコーディングにはいくらか手間がかかりますが、このアプローチでは有用な最適化が可能です。例えば、通過するオブジェクトの見かけのサイズに応じてプローブを更新することができます (つまり、小さなオブジェクトや、遠くにある大きなオブジェクトの場合は更新する必用はありません)。
Time Slicing
前述の Refresh Mode を Every Frame に設定するとき、処理負荷は大きくなります。Time Slicing を使用すると、更新のコストをいくつかのフレームに分散し、それぞれの負荷を削減できます。このプロパティーには 3 つの異なるオプションがあります。
All Faces at Once は、6 つのキューブマップの面を (同じフレーム上で) 即座にレンダリングします。ただし、6 つの 1 番目のレベルのミップマップのぼかし操作は、それぞれ別のフレームで行われます。残りのミップマップは 1 つのフレームでぼかし効果が加えられ、結果は別のフレームのキューマップにコピーされます。したがって、完全に更新が完了するのに 9 フレーム必用です。
Individual Faces は、All Faces at Once と同様に挙動しますが、(6 面すべてを最初のフレームで行うのではなく) 各キューブマップ面のレンダリングはそれぞれのフレームで行われます。完全なアップデートには 14 フレームが必要です。このオプションはフレームレートに最も低い影響を与えますが、ライティング条件が突然変化すると (例えば、ランプが突然オンになるなど)、更新時間が相対的に長くなることがあります。
No Time Slicing はタイムスライス操作を完全に無効にし、各プローブの更新が 1 つのフレーム内で行われるようにします。これにより、リフレクションが周囲のオブジェクトの外観と正確に同期することが保証されますが、処理コストが高くなる可能性があります。
https://gyazo.com/99356576c96e40d90b50892f6b32145f
ライトマップ + Reflection Probe
https://gyazo.com/99cc4d7fab59ba48d9e0dc33723c2f8e
ライトマップ + リアルタイムライト
https://gyazo.com/1b2013411534336e8403b3c99176d073
ライトマップ + ライトによるスペキュラーのみを上乗せ
鏡面反射
VRC_MirrorReflection を使う
RenderTexture で描写
1. 反射させたい方向にカメラを置いて、RenderTextureを生成
2. メッシュに読み込ませる
RenderTexture の背景を透明にする設定(要検証)
Camera
https://gyazo.com/94fc3776c9aab43e601e50541715085b
RenderTexture
https://gyazo.com/892043d74b6a2b17f14b49e7636eefba
uGUI の RawImage に使用する透過シェーダー(要検証)
反射がおかしくなるとき
Reflection probes spreading light through walls
https://gyazo.com/7669fb5971bac93622d275d0d17e8f7b
There are couple of ways you could try and circumvent this issue:
* Establish a clean reflection probe hierarchy, with a single probe encompassing the entire level, smaller probes covering the rooms, and smaller radius probes covering reflective objects of importance
* You can try covering the unwanted reflection probe contribution by placing another reflection probe in the problem area and increasing its importance value in the inspector
* If you are using HDRP, you have more options on how to author reflection probes (fade by face, by normals, direction, etc.)
* Lastly, make sure to use screen space reflections if you project allows for it. This should help with filling in the gaps where reflection probe technique fails
Refrection Probe を段階的に置く(全体を覆うプローブ→部屋を覆うプローブ→正しく反射させるための範囲の狭いプローブ)
反射のおかしい領域に別のプローブを置いて、inspector で importance の値を大きくする
Screen Space Refrection(SSR)を使う
https://gyazo.com/579942d91c63a1a8e317d6272228e00a
棚の中の反射が明らかに変です。
開口部の強烈な反射が遮蔽を無視して現われてしまうのです。
ディファードレンダリングの場合は、Reflection Probe のピクセルブレンディングや、
スクリーンスペースリフレクションを使用して、ある程度ごまかすことができます。
しかし、フォワードレンダリングの場合は上記の方法を使えないので、
オブジェクトを分離して反射を切ってみたり、
Smoothness を敢えて下げて反射を抑えてみたり、
最悪、妙な反射が残ったままほったらしになっている場合もかなりあるのではないでしょうか。
Standard シェーダーには Occlusion という名のテクスチャスロットがあり、
ここに入力された値はディフューズとリフレクションの両方に乗算される
これを利用する
1. Occlusion の中に入れたテクスチャがリフレクションのみに乗算されるように、シェーダーを改造する
2. 反射する範囲をマスクしたテクスチャを作り、 Occlusion の中に入れる
https://gyazo.com/32a19632588f698d664eb8225ba3068a
https://gyazo.com/d3f1ef68151609d8c49991263359967c