夜風のMixedReality

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

MRDL Surfaceを学ぶ Cube マテリアル 概要とBlend

本日はMRDLの勉強及び調査を行います。

〇MRDLとは?

MRDL(MixedRealityDesignLab)はMicrosoftによって提供されているMRTKを用いたHoloLensの実験的プロジェクト集です。

MRTKにはExamplesと呼ばれるサンプル集が提供されていますが、MRDLはどちらかと言うとオープンソースのアプリケーションとしての側面が大きく、MicrosoftStoreで提供されているだけではなくGithubソースコードとUnityのプロジェクト自体を取得することができ、中身をみながら学ぶことができます。

github.com

〇Surace

SurfaceはMRDで提供されているHoloLens 2専用のアプリケーションです。 HoloLens 2で使用できるHandTrackingを用いてアニメーションと音によって本来は得ることができない触角フィードバックを疑似的に再現する、体験することができるアプリケーションになります。

redhologerbera.hatenablog.com

youtu.be

〇Cube

Cubeは氷塊のようなクリスタルを指ではじくことができるシーンになります。 このシーンでは手の弾く速さや向きによって物理挙動が行われる[HandSmashService]に似た挙動が実装されています。

今回これをどのように実現しているのか気になったため、またクリスタルの見た目が美しいと感じたため最初にこのシーンを選びました。

これは[Assets/Surce/Scene]内に[Volume]という名前で存在しています。

f:id:Holomoto-Sumire:20210302180112j:plain

シーンを開くと[Smoke]という名前のプレファブが一つのみでHoloLensのシーンに共通しているカメラなどが一切ないことがわかります。

f:id:Holomoto-Sumire:20210302180208j:plain

これはアプリケーション実行時に[StartupScene]が読み込まれ、さらに[HandMenu]から[Cube]を選択した時、シーン遷移が行われることはなく、[StartuoScene]のままで[Cube]のオブジェクトが存在する[Volume]がロードされているためです。

f:id:Holomoto-Sumire:20210302180534j:plain

〇Finger

[Cube]を選択し[Volume]がロードされるとHandTrackingによって検知されたユーザーの各関節に合わせてクリスタルが配置されます。

f:id:Holomoto-Sumire:20210302182015j:plain

このオブジェクトは[Finger]という名前で[Smoke]オブジェクトの子オブジェクトとして格納されています。

f:id:Holomoto-Sumire:20210302182317j:plain

[Finger]オブジェクトが親オブジェクトに該当し[FingerTip]オブジェクトが実際に見えるクリスタルに該当します。

クリスタルには[VolumeShardsMat]という名前のマテリアルがアタッチされています。

●VolumeShardsMatマテリアル

f:id:Holomoto-Sumire:20210302182558j:plain

VolumeShadersMatマテリアルには[MixedRealityStanderdShader]が適応されています。

●RenderingSettings

VolumeShadersMatの[Rendering Mode]は[Custom]が設定されており、細かくカスタマイズが行われています。

f:id:Holomoto-Sumire:20210302182931j:plain

●Blending

Blendingは透明度や深度を持ったマテリアルの描画にかかわる設定です。

[SourceBlend]が[SrcColor]、[Distination Blend]が[OneMinusSrcColor]と設定されています。

f:id:Holomoto-Sumire:20210302183742j:plain

また、[BlendOption]が[Add]に指定されています。

これをShader内のコードで表すと

Blend SrcColor OneminuSrcColor
BlendOp add 

というようになります。これを文字であらわすと

最終的に出力される色= 現在の色* OneminuSrcColor+描画される色(=Shaderの処理結果)*SrcColor

というようになります。もう少しかみ砕くと

最終的な色=クリスタル以外の部分(背景)*(1-クリスタルのカラー)+Shaderで処理された色*(Shaderで処理された色)

これによってどのような変化が起こるのかをいかに示しました。

f:id:Holomoto-Sumire:20210302190332j:plain

二つのCubeがあり、奥が通常、手前が[VolumeShardsMat]マテリアルと同様のBlendを行ったものになります。(またCullをOffにして面の両面が描画されるようにしています。)

手前のほうが、まるで透明度を持っているかのように裏面まで見えるようになりました。

Cubeにはα値を与えていませんがこのような表現ができるととでクリスタルはα値を持っていませんがクリスタルの透明度を再現しています。

本日は以上です。