このページは?
Unity5からできるようになったGIことグローバルイルミネーション(Global Illumination)のサンプルシーンです。 先日行われたUNITE2015TOKYOで行われたUnity5のグラフィック機能についての 講演がとても面白かったので、特にGIについての部分に関して、実際にシーンをつくってみました。 GIでライトの反射光などが表現できるようになった、ということでわかりやすそうなシーンを作ってみました。 見てのとおり、ライトが青や緑のキューブに当たると白い床や壁も反射光でうっすらその色になります。 左下のスライダーはキャプション通りです。Unityのエディタ上のライトコンポーネントの2つにそのまま対応してます。 さらに矢印キーでつるつるの玉が動きます。
で、このシーンの説明とか
このシーンをよく観察するとちょっとおかしい(?)部分があります。 それは、奥にある赤いキューブにライトが当たると壁も床も赤くなるのに、手前の赤いキューブに当たってもそうなりません。 原因は奥の赤いキューブはstaticですが、手前の赤いキューブはstaticではないからです。 staticは動かないことがわかってるオブジェクトに立てるフラグで、インスペクタ上で名前の右にあるチェックボックスでon/offできるやつです。 staticなオブジェクト同士でのみ光が反射して影響し合います。
じゃあstaticでないもの、つまり動くオブジェクトはどうするかといえば、
コンポーネントとして、LightProbeGroupをアタッチすればOKです。
手前の赤いキューブはLightProbeGroupアタッチされているので反射光の影響を受けますが、ほかのオブジェクトに(反射光の)影響を与えません。
なので、光が当たっても壁が赤くならなかったのです。
となると、staticでないし、LightProbeGroupアタッチしてないオブジェクトの3種類があることになるはずです。まとめると
- staticなオブジェクト(反射光を作るし、影響も受ける)
- staticでないが、LightProbeGroupを持ったオブジェクト(反射光を作らないが、影響は受ける)
- staticでないし、LightProbeGroupも持たないオブジェクト(反射光を作らないし、影響もうけない)
このシーンには3種類のオブジェクトを置こうと思ったんですが、1つでもLightProbeGroupを持ったオブジェクトがあると LightProbeGroupを持っていないオブジェクトでも反射光の影響を受けるようです。(これに気づくのにだいぶかかっちゃいました) ライトプローブのマニュアルページ を見るとstaticでないオブジェクトは近くにあるライトプローブを使って反射光の影響を受け、そのライトプローブは自分のでもほかのオブジェクトのものでも関係ないっぽいですね。
で、ここまでの話、実はすごい重要な前提があってそれは「マテリアルがのシェーダーがディフューズである」ということです。 じゃあスペキュラなものはどうするかというとReflectionProbeコンポーネントをアタッチする必要があります。 このシーンでいうと動かせる鏡の玉がReflectionProbeがアタッチされているオブジェクトです。インスペクタのIntensityを1にすれば鏡みたいになります。
講演中で話題となった設定は鏡の中の描写方法です。インスペクタ上ではTypeの部分です。 動かない鏡ならbakedかRealtimeのOnAwakeにすれば使うキューブマップを一度作ればそのままなので描写付加がとっても小さい(カメラが回り込めば対応して見えるものが変わるが、目の前のものが動いても鏡の中は無反応)。 完全にリアルタイムで鏡の中を更新すると描写付加が高いだけではなく汚くなるのでその点は注意する、などなどでした。 このシーンにある鏡の玉の設定はTimeSlicingがAll face at onceです。何フレームか使ってキューブマップを作ってできたら描写、といった感じなのでフレームレートを落とす代わりに描写付加がまあまあ、という話でした。 実際にこのシーンを見てみてもフレームレートが落ちているとはほとんどわからないと思います。
この鏡の玉を動かしてると壁やキューブに近づくと突然明るくなるのがわかると思います。 これは玉の一定範囲のオブジェクトのみ玉の反射光の影響を受けるから見たいです。インスペクタ上でSizeという項目で変更できます。 これはキューブマップを作るときにも使います。講演ではこれの影響の変化をマイルドにできる、ってことでしたがその項目がどこにあるか見つけられてません……。 誰か教えてください><。
まとめ
まとめるとGIを使うにはこんな感じになると思います。
マテリアルのシェーダーがディフューズの場合
・動かないものはstaticにする。周りに対して反射光の影響を与えるし、影響も受ける。
・動くもにはLightProbeGroupコンポーネントをアタッチする。周りに対して反射光の影響を与えないが、影響は受ける。
マテリアルのシェーダーがディフューズの場合
・(動く動かないにかかわらず)ReflectionProbeコンポーネントをアタッチする。一定範囲のオブジェクトに対して反射光の影響を与える。影響の受け方は上と大差ない。
講演にはGI以外の話も多くあったのですがとりあえずこれくらいで。間違ってるとこの指摘とか質問とか何かあればtwitterなりブログのコメントなりでコンタクトしてもらえればと思います。
おまけ
最近のGoogle Chromeの更新でUnityWebPlayerがインストールされてるはずなのに、してください!となる症状が出るようです。 っていうか私は出ました。その解決方法のリンクを張っておきます。http://japan.unity3d.com/blog/?p=2276
このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License