MRTKv2のShader紹介です。(内容はほぼ意訳になります。)
概要
MRTK Standard shading システムは,単一で柔軟なシェーダーで, Unityの Standard shaderに似たビジュアルに達しつつ,Fluent Design Systemの原則に則り,加えてMRデバイスでパフォーマンスを維持することができます。
Example Scenes
MaterialGallery のシーンでShaderマテリアルの例を見ることができます。
MixedRealityToolkit.Examples/Demos/StandardShader/Scenes/
StandardMaterialComparison では,UnityのStandard ShaderとMRTK/Standardの違いを比較することができます。
MixedRealityToolkit.Examples/Demos/StandardShader/Scenes/
アーキテクチャ
MRTK/Standard Shaderは、uber shaderと呼ばれる、[Unity's shader program variant feature]というマテリアルのプロパティに応じて最適な Shaderコードを自動生成生成する機能が使われています。ユーザがマテリアルインスペクタ内のマテリアルプロパティを選択すると,マテリアルのプロパティで有効にした機能のみにパフォーマンスコストがかかります。
MRTK/Standardのカスタムマテリアルインスペクタは, MixedRealityStandardShaderGUI.cs と呼ばれています。インスペクタはユーザの選択に基づいて自動的にShader機能の有効/無効をユーザの選択し,レンダリングのセットアップを手助けします。各機能の詳細情報は,各プロパティ上にカーソルを置いて,Unity Editorのtooltipを確認してください。
ライティング
MRTK/Standardでは,ライティングに単純な近似を使用しています。これはShaderが物理的な正確性を計算せず,省エネであることで,より素早く効率的にレンダリングするためです。Blinn-Phongは,物理ベースのライティングに近づけるために,フレネルおよびイメージベースの照明とブレンドされた主要な照明技術です。このShaderは以下のライティング手法をサポートしています。
Directional Light
有効になっていれば,シーン内の1つ目のDirectional Lightの向き,色,強度を優先します。Dynamic point lights, spot lights,その他Unityのライトはリアルタイムライティングで考慮しません。
Spherical Harmonics
有効になっていれば,球面調和関数を使ったLight Probeでシーン内のライトを近似します。計算コストを減らすために,頂点毎の計算を行っています。
Lightmapping
静的なライティングのために,ShaderはUnityのLightmapping systemによって生成されたライトマップを使用します。これを使うためには単にレンダリングをstaticとしてマークするだけです。
Hover Light
ホバーライトは,オブジェクトの表面近くでホバリングする「点光源」を模したFluent Design Systemのパラダイムです。遠くのカーソルのライティングでよく使われており,HoverLight.csを介してホバーライトのプロパティを制御できます。一度に最大3つのホバーライトがサポートされます。
Proximity Light
近接ライトは,物体の表面近辺をホバリングする"勾配逆のポイントライト"を模倣するFluent Design Systemパラダイムです。これはよく近接カーソルで使われ,ProximityLight.csからプロパティをコントールすることができます。一度に2つの近似ライトがサポートされます。
Lightweight Scriptable Render Pipeline Support
MRTKは開発者がUnityのLightweight Scriptable Render Pipeline (LWRP)をMRTKのShaderでも利用できるようにしています。
Mixed Reality Toolkit -> Utilities -> Upgrade MRTK Standard Shader for Lightweight Render Pipelineでアップグレードすることができます。
アップグレードすると,MRTK/Standard Shaderは差し代わり,マゼンダ色は修正されるはずです。アップグレードできたかどうかはコンソールで次のようになっているかをチェックしてください。Upgraded Assets/MixedRealityToolkit/StandardAssets/Shaders/MixedRealityStandard.shader for use with the Lightweight Render Pipeline.
Texture Combiner
channel packkingを利用して,UntyStandardShaderのピクセル当たりのmetallic, smoothness, emissiveそれとocculusion値を改善することができます。
channel packingを使う時,4つの別々のテクスチャではなく,1つのテクスチャをサンプリングしてメモリにロードするだけです。もしSubstanceやPhotoshopのようなプログラムでテクスチャマップを書くとき,手動パックすることができます。
または,MRTK Texture Combiner Toolを使ってすることもできます。Mixed Reality Toolkit -> Utilities -> Texture Combinerを開いて以下のようにします。
Unity Standard Sharderを選択し,"Autopopulate from Standard Material"をクリックすることで, ウィンドウは自動で埋まります。または,赤,緑,青,またはアルファチャンネルごとにテクスチャ(または定数値)を手動で指定することもできます。テクスチャの組み合わせはGPUで高速化されているため,入力テクスチャをCPUからアクセス可能にする必要はありません。
その他の機能のドキュメント
以下はMRTK / Standardシェーダで利用可能ないくつかの機能に関する詳細です。
プリミティブのどちら側をクリップするか(内側または外側)を指定できまる,良パフォーマンスな面,球体,およびボックス形状のクリッピング機能。使い方のシーンは、MixedRealityToolkit.Examples / Demos / StandardShader / Scenes /の,ClippingExamplesにあります。
ClippingPlane.cs,ClippingSphere.cs,それと ClippingBox.cs を使って簡単にクリッピングをコントロールすることができます。
ポータルなど,さまざまな効果を実現するための設定可能なステンシルテストサポートが組み込まれています。
何千ものGPUインスタンスメッシュに独自のマテリアルプロパティを与えるためのnstancedカラーサポート しています。
Triplanarマッピングはプログラミックにメッシュをテクスチャリングする技法です。terrain,UVなしのメッシュ,unwrapが難しい形状によく使われます。この実装はワールド,ローカルスペースへのプロジェクション,smoothnessのブレンディング,ノーマルマップをサポートします。使用される各テクスチャーは3つのテクスチャーサンプルを必要とするので,パフォーマンスが重要な状況では使用を控えるように注意してください。
Albedoを最適化するためのチェックボックスがあります。アルベドテクスチャが指定されていない場合,最適化としてアルベド操作は無効になります。これを制御するにはチェックボックスを有効にしてください。
ピクセル単位のクリッピングテクスチャ,ローカルエッジベースのアンチエイリアシング,および法線マップのスケーリングがサポートされています。
ワールド空間での頂点押し出し機能。押し出されたバウンディングボリュームやメッシュの開閉を視覚化するのに便利です。