夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedRealityToolkit GraphicsTools DistantLightを完全に理解する

本日はまとめ記事です。

〇MixedRealityToolkitGraphicsToolsとは?

MixedRealityToolkitGraphicsTools(MRGT)はMicrosoftによって提供されているMixedRealityアプリ向けのUnitySDKであるMixedRealityToolkit3(MRTK3)の一つでグラフィックを担っています。

xRデバイスでのパフォーマンスを維持したグラフィックをコンセプトに開発されているため、例えばxRデバイスの開発でよく発生するトラブルである片目が描画されないといったトラブルが発生しない作りであるとともに、Unity開発で役立つ数多くのツールが同梱されています。

github.com

〇DistantLightとDistantLightでできること

DistantLightはMRGTで提供されているライトコンポーネントです。

DistantLightを使用することでUnityのDirectionalLightとは別のレイヤーで光源を追加することができます。

手前のSphereにDistantLightを使用、奥のSphereはデフォルト(DirectionalLight)

DistantLightは主にUIなど光源として使用することを想定され実装されました。

〇使い方

DistantLightはMRGTで提供されている機能ということもあり現時点で以下のシェーダーを使用しているマテリアルで使用することができます。

・GraphicsTools Standard Shader

・GraphicsTools StanderdCanvas Shader

 DistantLightが実装されたMRGTv0.4以降では対象のシェーダーを適応しているマテリアルのプロパティでLightModeと呼ばれる項目からLit-Distant Lightを選択することで使用できます。

 シーン内にDistantLightコンポーネントをアタッチしているゲームオブジェクトのZ軸を光源としてライトとして使用することができます。

 Color、Intensityでライトの強さ、色を制御します。

〇制限

 現在Defaultで1つのDistantLightのみが使用されるようになっています。

〇実装

DistantLightクラスは同じくMRGTで提供されるBaseLightクラスを継承するクラスです。

BaseLightによって次のメソッドが実行されており、次のような処理を行っています。

・Initialize()

最初に実行されます。

ここではShaderの持つユニークIDを取得しています。

・AddLight()

最初に一回、またライトが追加されたタイミングに実行されます。

おこなっていることはListにlight情報を追加することです。

これによってシーン内のライトの数を管理しています。

この際に1つライトにつき2つの枠を追加しています。

1つ目のデータ領域にDistantLightの向き(Direction)、2つ目のデータ領域に色情報をそれぞれVector4で代入しています。

・RemoveLight()

ライトが削除される際に実行されている処理です。

おこなっていることはList追加されているlight情報を削除して更新することです。

・UpdateLight()

LateUpdateで実行される処理です。

アタッチされているオブジェクトのTransform.forwerdを取得して、向きを取得、inspectorで任意に設定可能なColorをIntensityの強さでデータとして代入しています。

またこのメソッド内でShaderのグローバル変数としてデータをマテリアルに渡しています。

  Shader.SetGlobalVectorArray(_DistantLightDataID, distantLightData);

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

DistantLightでは特に難しい処理はしていませんでしたが、BaseLightを使用したMRGTのライトの仕組みはカスタマイズできたら様々な表現ができそうです。

本日は以上です。