top

はじめに

VRChat に限らず、Unity や Unreal Engine などで質の良い 3D ワールドを製作する場合、ベイク (光の当たり具合の事前計算) は必須の措置だと思います。

Unity の場合、ベイク機能がデフォルトで組み込まれているのですが、処理時間が長くて効率が悪いため、外部のアセットを使うなどして、時間の短縮を図る方は多いのではないでしょうか?

自分も同じで、ベイクには Bakery と呼ばれる Unity アセットストアで販売されている有料のベイクツールを使用しています。

https://assetstore.unity.com/packages/tools/level-design/bakery-gpu-lightmapper-122218

通常は、Bakery でベイクをするで問題ないのですが、Unity デフォルトのベイク機能を使いたい場合もあります。例えば Realtime GI を活用したい場合です。

Realtime GI を使うと、Emission を有効にしたオブジェクトマテリアルのリアルタイムの変更が、周囲に影響を与えることが出来るようになります。

以下の動画は、その様子を撮影したものです。

この Realtime GI を活用すれば、VRChat の動画プレイヤーの明かりが、室内にリアルタイムに反映される、といったことも出来るようになります。

ただ、この Realtime GI を使う場合、必然的にベイクは Unity 標準のベイク機能を選択しなければならないため、結果的にベイク処理に膨大な時間が掛かってしまい、効率が悪いです。

今回は、この Unity 標準の Realtime GI を使いながらも、同時に Bakery のベイク (Baked GI) も同時に行える方法を紹介しようと思います。

手順

Realtime GI の有効化

  1. メニューの「Windows」→「Rendering」→「Lighting」を選択
  2. Lighting ウィンドウで「Realtime Global Illumination」をチェック

Realtime GI の Lightmapper を Enlighten に設定 (Bakery の為に設定)

  1. メニューの「Edit」→「Project Settings…」を選択
  2. Project Settings ウィンドウで「Edit」→「Enable Enlighten for Baked GI (Legacy)」をチェック
    (※ 注意点あり)
  3. メニューの「Windows」→「Rendering」→「Lighting」を選択
  4. Lighting ウィンドウで「Lightmapper」を Enlighten に設定

シーン上のオブジェクトの設定

  1. ベイクしたいオブジェクトを static に設定

  2. Realtime GI 用の光源にしたいオブジェクト (以下、Realtime GI オブジェクトと呼称) を static に設定

  3. Realtime GI オブジェクトに適用するマテリアルの「Global Illumination」を Realtime に設定

  4. Realtime GI オブジェクトの変化を周囲に伝えるための U# スクリプトを作成して、Realtime GI オブジェクトに適用

    // スクリプトの例
    
    using UdonSharp;
    using UnityEngine;
    using VRC.SDKBase;
    using VRC.Udon;
    
    public class RealtimeGI : UdonSharpBehaviour
    {
        private MeshRenderer _renderer;
    
        void Start()
        {
            _renderer = GetComponent<MeshRenderer>();
        }
    
        void Update()
        {
    		// この行で、Renderer のリアルタイムの更新を周囲に伝えます
            RendererExtensions.UpdateGIMaterials(_renderer);
        }
    }
    

Bakery の設定

  1. メニューの「Tools」→「Render Lightmap…」を選択
  2. ウィンドウ上で「Settings mode」を Experimental に設定
  3. ウィンドウ上で「Combine with Enlighten real-time GI」にチェック
  4. 「Render」を選択してベイクを実行

後はシーンのデバッグ実行中に、エディター上で Realtime GI オブジェクトのマテリアルの色を変更すると、周囲に光源の変化が伝わる様子が見られると思います。

お疲れ様でした😊

注意点

今回紹介した方法ですが、1つ気をつけなければならない点があります。

Project Settings ウィンドウでチェックした「enable Enlighten for Baked GI (Legacy)」ですが、これは Unity 2023 以降で廃止予定になる項目のようです。

Enable the Enlighten backend for Baked GI lightmaps. This is a deprecated feature that is no longer available in 2023.1 and later.

この記事を執筆している 2024年10月時点では VRChat 推奨の Unity バージョンは 2022 3.22f1 なので問題は生じないのですが、いずれ Unity のバージョンを上げる必要に迫られたときに「enable Enlighten for Baked GI (Legacy)」が消えることで、Bakery が Enlighten を認識できなくなってしまいます。

Bakery が何らかの対策を行ってくれれば良いのですが、Enlighten との併用機能は Experimental (実験) モードに存在するため、あまり期待できないかなというのが個人的な意見です。

おわりに

今回紹介した方法を使うことで、注意点はあるものの、Enlighten の Realtime GI と Bakery による Baked GI を併用することができました。

以下の動画は、この方法で VRChat で動画プレイヤーを再生した様子を撮影したものです。

動画プレイヤーは最初から Realtime GI に対応しているので、動画プレイヤー自体 (Screen) には、サンプルのスクリプトを適用するだけで済みます。

動画プレイヤーをリアルタイムな光源として活用することで、雰囲気の良い空間を演出することができますね✨

他にも、Realtime GI は色々な応用ができそうです。

今回は、以上です。お疲れ様でした!