はじめに
従来のProbe Voumeより実装が簡単になったAdaptive Probe Volumes(次回以降APV)を使用してみた。しかし、参考記事が少なく、内容も実装のみが多かった。明るい部屋から暗い部屋にシーン実行の途中で変更したくても変え方が分からなかったが何とか実装できたので、同じようなことしたい人の手助けになれば嬉しい。また、徐々に変更も可能なので使えるところは多いと思う。
環境
Unity : 6000.0.26f1 (HDRP)
RenderPipline : HDRP
実装
適当なシーンを作成。今回はこのような感じ。4つのライトのうち、4つのライトがついている状態から3つが消える状態を作成予定。
今回はAdaptiveProbeVolumesの導入はカット。導入方法はこちらを参考に
Edit -> ProjectSettings -> QualityのHDRP -> Lightingの欄のLightProbeLightのLightingScenarioとScenarioBlendingをオンに
そのようにすると、ライティングのウィンドウにLightingScenarioの欄が追加されている。BrightとDarkのシナリオを追加。
Brightをアクティブにし、シーン内のライトをオンにしてGenerate Lighting。次に、Darkをアクティブにし、シーン内のライトをオフにして同じことを。
アクティブを変更するとベイク結果を簡単に変更できるようになる。
次に、動的に変更を実装
LightingManager.cs作成。はじめに全体を
using UnityEngine;
using UnityEngine.Rendering;
public class LightingManager : MonoBehaviour
{
private ProbeReferenceVolume probeReferenceVolume;
[SerializeField] private string[] scenarioKey;
private int currentNum = 0;
private int nextNum = 1;
[SerializeField][Range(0, 1)] private float blendVolume = 1.0f;
[SerializeField][Min(1)] private int blendCell = 1;
public void SetRoom(int id)
{
probeReferenceVolume.BlendLightingScenario(scenarioKey[id], blendVolume);
currentNum = id;
}
void Start()
{
probeReferenceVolume = ProbeReferenceVolume.instance;
probeReferenceVolume.lightingScenario = scenarioKey[currentNum];
probeReferenceVolume.numberOfCellsBlendedPerFrame = blendCell;
}
void Update()
{
if(Input.GetKey(KeyCode.Space))
{
SetRoom(nextNum);
}
}
}
最初にProbeReferenceVolumeのインスタンスを取得(シングルトン)
probeReferenceVolume = ProbeReferenceVolume.instance;
ライティングシナリオは2つのライティングを混ぜ合わせることでライティングを決めるので現在のライティングと次のライティングを決める必要がある。そのため、最初のシナリオキーを代入(Bright)。
probeReferenceVolume.lightingScenario = scenarioKey[currentNum];
現在のシナリオと変更したいシナリオの比率。(1に近づくと変更したいシナリオになる。0に近づくと現在のシナリオになる。)(2色の絵の具の混ぜ合わせのイメージ)
private float blendVolume = 1.0f;
1Frame時に何セル分処理をするか(箱が積まれていて何箱を1Frameで処理するかのイメージでいいと思う。間違っていたらコメントしてください。)
private int blendCell = 1
変更の関数
public void SetRoom(int id)
{
probeReferenceVolume.BlendLightingScenario(scenarioKey[id], blendVolume);
currentNum = id;
}
適当なオブジェクトにLightingManagerをアタッチ。ScenarioKeyの要素0に Bright を代入、要素1に Dark を代入。
グラフィックレベルによって設定が変わるため、グラフィックレベルの変更を導入するような方はグラフィックレベルすべてに最初の設定で行ったLightingScenarioとScenarioBlendingをオンにしておくように
まとめ
変更自体は簡単だが数値の調整の問題なのか正直少し粗が見える。Unity公式の動画ではかなり綺麗だが...ライティングは思いがけない形になったりして難しいや。
粗が分かりやすいところはLightMapを使って綺麗にするのが一番かな。その場合、LightMapの変更を実装しないといけないけど。APVはとにかくライティング時間が短いから失敗してもかなりストレスフリーで出来るのがいい。変更するのもクリック1つで変更できるのもAPVの良さですね。
何か意見、感想や相談あれば気軽にコメントしてください。
これまで閲覧して頂き、ありがとうございました。
参考