cluster SDK Layer 調査記録
この記事はclusterアドベントカレンダーの8日目の記事です。
今回はclusterに関する技術的な内容ということで、cluster SDKで利用可能なUnityのLayerに関する調査してみました。
cluster SDK Layer一覧
cluster SDKをインポートするとUnity Editor上に上記のようなLayerが作成されます。
Layer調査
実際にどう表示されるか、会場をつくり調査しました。特定のLayerのみ描画するカメラ式ミラーを用意してそこに映るオブジェクトを調べました。
ざっと調べた感じ対応は以下のような感じです
Default
・会場内のスクリーン、コメントボード、ランキングボード
・エモーション、サイリウム、Vアイテム
・パーソナルエリアの範囲表示
UnityのDefaultのレイヤー、Unity Editor上に追加したオブジェクトはデフォルトでこのLayerになります。誰からでも見えます。
UI
・コメントのセル、ランキング、VRのUI全般
・カメラ(UI上の画像などはGrabbableUI)
アバター、プレイヤーに関連するレイヤーは以下のようなものがあります。
FIRSTPERSON_ONLY_LAYER
自分の一人称視点からみたときに映るオブジェクト、アバターの体がこのLayerです。顔は映りません。
THIRDPERSON_ONLY_LAYER
三人称視点、他者から自分のアバターを見たときに映るオブジェクト、顔や体を含みます。
このレイヤーはちょっと面白くてVRモードだとカメラのデスクトップ画面にだけ映るオブジェクト、デスクトップモードだとカメラマンモードの時だけ映るオブジェクトになります。
上の2つはVRMのLayerです。VRMのエクスポート時に設定できます。
OwnAvatar
アクセサリを自分のアバターに付けている場合、自アバターのアクセサリにこのLayerが設定されます。
PerformerOnly
ゲストエリアのコライダーのLayerです。このLayerを設定したコライダーはゲストとスタッフじゃないと通れません。
Performer
自分以外のゲスト、スタッフはこのLayerが設定されます。
Audience
自分以外の一般参加者がこのLayerになります。
用途不明なLayer
・Keyboard、GrabbleItem
・VenueLayer0、VenueLayer1、VenueLayer2
このLayerに設定されている描画オブジェクトはありませんでした。使われていないか、処理上必要な内部的なLayerかもしれません。
応用例
カメラに映るレイヤーを分けることで以下のようにアバターのみエフェクトをかけるといったことが可能です。
仕組みとしてはアバターのみ描画するカメラと背景のみ描画するカメラを用意して出力された画像をミラー描画時に合成するだけです。
アバターのみ描画するカメラAと背景用カメラBを用意します。カメラAのCulling MaskにTHIRDPERSON_ONLY_LAYER、OwnAvatar、Performer、Audience、カメラBの方はDefaultに設定します。
カメラAとカメラBの合成にはカメラAのAlpha値を使います。
カメラAの背景をAlpha=0のカラーに設定して、シェーダー上で以下のように合成してあげます。
fixed4 avatar = tex2D(_CameraTexA, uv);
fixed4 background = tex2D(_CameraTexB, uv);
fixed4 output = lerp(col, avatar, avatar.a);
ただしこれには問題があって、半透明部分の描画は変になったり、背景とアバターの前後関係がおかしくなります。Alphaを使わず深度バッファを使えば前後関係の問題は解決すると思います。
最後に
公式ドキュメントにLayerに関しての情報がなかったので今回、独自に調査をしてみました。ドキュメントの方が更新されればそちらを参照してください。
レイヤーを使えば、特定のカメラにしか映らないようにしたりといろいろとできるので応用次第では結構面白いことができるかもしれません。
明日はとみねさんの『アバター文化の話とかをかくよ』です。clusterユーザーにとってアバターは切っても切り離せないものなのでどんな内容なのか楽しみです!