MRが楽しい

MRやVRについて学習したことを書き残す

MRTKStandardシェーダのChannelMapを利用する

本日は MRTK の技術調査枠です。
MRTKStandardシェーダのChannelMapを利用する手順を記事にします。
f:id:bluebirdofoz:20200727231922j:plain

MRTKStandardシェーダ

HoloLens を初めとする複合現実デバイスでのパフォーマンスを維持するための軽量なシェーダです。
軽量ながら Unity の Standard シェーダーと同様のビジュアルを実現することができます。
microsoft.github.io

MRTKStandardシェーダはマテリアルプロパティに基づいて最適なシェーダーコードを自動生成する「uberシェーダ」です。
Inspector でマテリアルプロパティを選択すると、有効にした機能のパフォーマンスコストのみが発生します。

チャンネルマップ(ChannelMap)

チャンネルマップはピクセル単位で以下のマテリアルプロパティを制御する場合に利用します。
・Metallic(金属)
・Smoothness(滑らかさ)
・Emission(放射)
・Occlusion(オクルージョン)

チャンネルマップはこれらの情報を1つのテクスチャにサンプリングしたものです。
1つのテクスチャに含まれる RGBA の情報がそれぞれ以下のプロパティに紐づきます。

RGBAチャンネルプロパティ
赤(Red)Metallic(金属)
緑(Green)Occlusion(オクルージョン)
青(Blue)Emission(放射)
透明度(Alpha)Smoothness(滑らかさ)

チャンネルマップを利用する事で1つのマテリアルで様々な質感を持つオブジェクトを作成できます。
マテリアルの削減はレンダリング負荷の軽減に繋がるため、パフォーマンスがより向上します
f:id:bluebirdofoz:20200727231944j:plain

上記例で使用しているチャンネルマップは以下のようなテクスチャになります。
f:id:bluebirdofoz:20200727231955j:plain

テクスチャコンバイナ(Texture Combiner)

チャンネルマップはテクスチャコンバイナを使って各種プロパティの情報を持つテクスチャファイルから作成できます。
最大4つのテクスチャを1つのチャンネルマップにまとめることができます。

メニューから Mixed Reality Toolkit -> Utilities -> Texture Combiner を選択して起動します。
f:id:bluebirdofoz:20200727232006j:plain

テクスチャコンバイナは Tools パッケージに含まれています。
メニューに Texture Combiner が表示されない場合は、Tools パッケージがインポートされていない可能性があります
f:id:bluebirdofoz:20200727232015j:plain

テクスチャコンバイナを起動すると、ウィンドウが開きます。
2つのチャンネルマップの作成手順があります。
f:id:bluebirdofoz:20200727232025j:plain

テクスチャ指定の場合

テクスチャ指定でチャンネルマップを作成する場合は、マップ毎にテクスチャを設定します。
以下の設定項目があります。

Metallic/Occlusion/Emission/Smoothness Map
  - 各種プロパティの情報を持つテクスチャを指定します。
Input Channel
  - プロパティの情報がテクスチャのRGBAいづれの情報として保持されているか指定します。
    今回は全て白黒(R:0~1,G:0~1,B:0~1)のテクスチャを指定しているので[Red]を参照させています。
Metallic/Occlusion/Emission/Smoothness Uniform
  - 各種プロパティのテクスチャを指定しない場合のデフォルト値です。
    -0.01を指定している時は推奨のデフォルト値が使用されます。

設定後、[TextureFormat]で出力形式を指定し、[Save Channel Map]で出力を行います。
f:id:bluebirdofoz:20200727232039j:plain

これでチャンネルマップが出力されます。
f:id:bluebirdofoz:20200727232050j:plain

チャンネルマップを適用するには、対象オブジェクトのマテリアルを MixedRealityToolkit/Standard シェーダに切り替えます。
f:id:bluebirdofoz:20200727232059j:plain

[Channel Map]のチェックを入れて、作成したチャンネルマップを指定します。
これでチャンネルマップに基づいた質感の描画が行われます。
f:id:bluebirdofoz:20200727232109j:plain

マテリアル指定の場合

作成済みのマテリアルを元にチャンネルマップを作成することもできます。
例えば、以下のような Unity/Standard シェーダで質感設定を行ったマテリアルを用意します。
f:id:bluebirdofoz:20200727232120j:plain

[Standard Material]で先ほどの Unity/Standard シェーダのマテリアルを指定します。
この状態で[Autopopulate from Standard Material]を実行します。
f:id:bluebirdofoz:20200727232132j:plain

すると、以下のように自動で設定が展開されます。
[TextureFormat]で出力形式を指定し、[Save Channel Map]で出力を行います。
f:id:bluebirdofoz:20200727232142j:plain

チャンネルマップが作成されました。
後はテクスチャ指定と同様に、MixedRealityToolkit/Standard シェーダでチャンネルマップを使用します。
f:id:bluebirdofoz:20200727232155j:plain

Emission(発光)のみ利用手順が少し異なるので、記事を作成しました。
bluebirdofoz.hatenablog.com