MRTK2 標準シェーダー
MRTK2 Standard シェーディング システムは、Unity の標準シェーダーと同様のビジュアルを実現し、Fluent Design Systemの原則を実装し、Mixed Reality デバイスでパフォーマンスを維持できる、1 つの柔軟なシェーダーを利用します。
シーンの例
シェーダーの素材の例は、MRTK/Examples/Demos/StandardShader/Scenes/
の MaterialGallery シーンにあります。 このシーン内のすべての素材は、MRTK/標準シェーダーを使用しています。
Unity/標準シェーダーの例に対して MRTK/標準シェーダーを比較してテストするための比較シーンが、MRTK/Examples/Demos/StandardShader/Scenes/
の StandardMaterialComparison シーンにあります。
Architecture
MRTK/標準シェーディング システムは、素材のプロパティに基づいて最適なシェーダー コードを自動生成する Unity のシェーダー プログラムのバリアント機能を使用する優れたシェーダーです。 ユーザーがマテリアル インスペクターで素材のプロパティを選択すると、有効にした機能のパフォーマンス コストだけが発生します。
マテリアル インスペクター
MixedRealityStandardShaderGUI.cs
という名前の MRTK/標準シェーダー用のカスタム マテリアル インスペクターが存在します。 インスペクターは、ユーザーの選択とレンダリング状態の設定に基づいて、シェーダー機能を自動的に有効または無効にします。 各機能の詳細については、Unity エディターの各プロパティにマウスのポインターを合わせて、ヒントを参照してください。
インスペクターの最初の部分は、素材のレンダリング状態を制御します。 レンダリング モードは、マテリアルをいつどのようにレンダリングするかを決定します。 MRTK/標準シェーダーの目的は、Unity/標準シェーダーのレンダリング モードをミラー化することです。 MRTK/標準シェーダーには、優れたユーザー コントロールのための加法レンダリング モードとカスタム レンダリング モードも含まれています。
レンダリング モード | 説明 |
---|---|
非透過的 | (既定値) 透明領域がない通常のソリッド オブジェクトに適しています。 |
切り抜き | 不透明領域と透明領域の間にハード エッジを持つ透明効果を作成できます。 このモードでは、半透明の領域はありません。テクスチャは 100% 不透明か非表示です。 これは、透明度を使用して、植物などの素材のシェイプを作成する場合に便利です。 |
フェード | 透明度の値で、オブジェクトが持つ可能性のある鏡面ハイライトや反射などを含めて、オブジェクトを完全にフェード アウトできるようにします。 このモードは、オブジェクトのフェード インまたはフェード アウトをアニメーション化する場合に便利です。反射とハイライトもフェード アウトされるため、透明なプラスチックやガラスなどのリアルな透明な素材のレンダリングには適しません。 |
透過 | 透明なプラスチックやガラスなどのリアルな透明素材のレンダリングに適しています。 このモードでは、素材自体が透明度の値を持ちます (テクスチャのアルファ チャネルと、色の濃淡のアルファに基づいて)。 ただし、反射と照明のハイライトは、実際の透明な素材の場合と同様に、完全な明確さで、変更なく表示されます。 |
加法 | 前のピクセルの色と現在のピクセルの色を合計する加法ブレンド モードを有効にします。 これは、透明性の並べ替えの問題を回避するために推奨される透過性モードです。 |
Custom | レンダリング モードのすべての側面を手動で制御できます。 高度な使用方法でのみ使用します。 |
カリング モード | 説明 |
---|---|
オフ | 面のカリングを無効にします。 カリングは、2 面メッシュが必要な場合にのみオフに設定する必要があります。 |
Front | 前面カリングを有効にします。 |
戻る | (既定値) 背面カリングを有効にします。 レンダリングのパフォーマンスを向上させるために、背面カリングを可能な限り頻繁に有効にする必要があります。 |
パフォーマンス
Unity 標準シェーダーではなく MRTK 標準シェーダーを使用する主な利点の 1 つは、パフォーマンスです。 MRTK 標準シェーダーは、有効になっている機能のみを利用するように拡張できます。 ただし、MRTK 標準シェーダーは、Unity 標準シェーダーと同等の外観が得られるようにも記述されていますが、コストははるかに低くなります。 シェーダーのパフォーマンスを比較する簡単な方法の 1 つは、GPU で実行する必要がある操作の数です。 もちろん、計算の規模は、有効になっている機能や他のレンダリング構成によって変動する可能性があります。 ただし、一般に、MRTK 標準シェーダーが実施する計算は Unity 標準シェーダーよりも大幅に少なくなっています。
Unity 標準シェーダー統計の例
MRTK 標準シェーダー統計の例
Note
これらの結果を生成するには、Unity インスペクターでシェーダー資産を選択して表示し、[コンパイルしてコードを表示] ボタンをクリックします。
照明
MRTK/標準では、照明に単純近似が使用されます。 このシェーダーは物理的な正しさや電力節約のために計算していないため、すばやく効率的にレンダリングされます。 主要な照明手法は Blinn-Phong で、フレネルとイメージベースの照明と組み合わせて、物理ベースの照明を概算します。 シェーダーでは、次の照明手法がサポートされています。
指向性ライト
シェーダーは、シーン内の最初の Unity の指向性ライトの方向、色、強度に従います (有効な場合)。 動的なポイント ライト、スポット ライト、または他の Unity ライトは、リアル タイムの照明では考慮されません。
球面調和関数
シェーダーは、ライト プローブを使用して、球面調和関数でシーン内のライトを概算します (有効になっている場合)。 球面調和関数の計算は、計算コストを削減するために頂点ごとに実行されます。
ライトマッピング
静的な照明の場合、シェーダーは、Unity のライトマッピング システムによって構築されたライトマップに従います。 レンダラーを静的 (またはライトマップ静的) としてマークするだけで、ライトマップを使用できます。
ホバー ライト
- ホバー ライトに関する説明を参照してください。
近接ライト
- 近接ライトに関する説明を参照してください。
Lightweight Scriptable Render Pipeline のサポート
MRTK にはアップグレード パスが含まれているので、開発者は MRTK シェーダーで Unity の Lightweight Scriptable Render Pipeline (LWRP) を利用できます。 Unity 2019.1.1f1 および Lightweight RP 5.7.2 パッケージでテストされています。 LWRP の使用を開始する手順については、 こちらのページを参照してください。
MRTK のアップグレードを実行するには、次のように選択します。[Mixed Reality Toolkit] -> [ユーティリティ] -> [ライトウェイト レンダリング パイプライン用の MRTK 標準シェーダーのアップグレード]
アップグレードが行われると、MRTK/標準シェーダーが変更され、マゼンタ (シェーダー エラー) の素材を修正する必要があります。 アップグレードが正常に行われたことを確認するには、コンソールで、Upgraded Assets/MixedRealityToolkit/StandardAssets/Shaders/MixedRealityStandard.shader for use with the Lightweight Render Pipeline を確認します。
UGUI のサポート
MRTK 標準シェーディング システムは、Unity の組み込み UI システムと連携して動作します。 Unity UI コンポーネントでは、unity_ObjectToWorld マトリックスは、Graphic コンポーネントが含まれるローカル変換の変換マトリックスではなく、その親の Canvas の変換マトリックスです。 MRTK/標準シェーダー効果の多くは、オブジェクトのスケールを把握する必要があります。 この問題を解決するために、UI メッシュの構築中に、ScaleMeshEffect.cs
によってスケーリング情報が UV チャネル属性に格納されます。
Unity イメージ コンポーネントを使用する場合は、ソース イメージに [なし (スプライト)] を指定して、Unity UI が余分な頂点を生成しないようにすることをお勧めします。
MRTK 内のキャンバスでは、必要なときに の ScaleMeshEffect.cs
追加を求められます。
テクスチャ コンバイナー
Unity 標準シェーダーのピクセルごとのメタリック、滑らかさ、放射、オクルージョンを改善するために、チャネル パッキングを使用して値をすべて制御できます。 次に例を示します。
チャネル パッキングを使用する場合、4 つの別個のテクスチャではなく、1 つのテクスチャをサンプリングしてメモリに読み込むだけで済みます。 テクスチャ マップを Substance や Photoshop などのプログラムに記述する場合は、次のようにハンド パックできます。
チャネル | プロパティ |
---|---|
[赤] | メタリック |
[緑] | オクルージョン |
ブルー | 放射 (グレースケール) |
[アルファ] | 滑らかさ |
または、MRTK テクスチャ コンバイナー ツールを使用することもできます。 ツールを開くには、[Mixed Reality Toolkit] -> [ユーティリティ] -> [テクスチャ コンバイナー] の順に選択します。次のウィンドウが開きます。
このウィンドウを自動的に入力するには、Unity 標準シェーダーを選択し、[標準マテリアルから自動入力する] をクリックします。または、赤、緑、青、またはアルファ チャネルごとに、テクスチャ (または定数値) を手動で指定することもできます。 テクスチャの組み合わせは GPU でアクセラレートされ、入力テクスチャが CPU にアクセス可能である必要はありません。
その他の機能に関するドキュメント
MRTK/標準シェーダーで利用できるいくつかの機能の詳細については、以下を参照してください。
プリミティブ クリッピング
- 「クリッピング プリミティブ」を参照してください
メッシュ アウトライン
多くのメッシュ アウトライン手法は、後処理の手法を使用して実行されます。 後処理では、優れた品質のアウトラインが提供されますが、多くの Mixed Reality デバイスでは非常にコストがかかる可能性があります。
MRTK/Examples/Demos/StandardShader/Scenes/
の OutlineExamples シーンでメッシュ アウトラインの使用状況を示すシーンを見つけることができます。
MeshOutline.cs
および MeshOutlineHierarchy.cs
を使用すると、メッシュ レンダラーの周囲にアウトラインをレンダリングできます。 このコンポーネントを有効にすると、アウトラインを表示するオブジェクトの追加のレンダリング パスが導入されますが、モバイルの Mixed Reality デバイスで実行するように設計されており、後処理は使用できません。 この影響の制限事項としては、水密でない (または 2 面である必要がある) オブジェクトには適していません。また、重なり合うオブジェクトでは、深度の並べ替えの問題が発生する可能性があります。
アウトライン動作は、MRTK/標準シェーダーと組み合わせて使用するように設計されています。 通常、アウトラインの素材は純色で照明のない色ですが、さまざまな効果を実現するように構成できます。 アウトラインの素材の既定の構成は次のとおりです。
- [深度の書き込み] - アウトラインによって他のオブジェクトのレンダリングが妨げられないようにするために、アウトラインの素材に対して無効にする必要があります。
- [頂点の浮き出し] - アウトラインをレンダリングするには、有効にする必要があります。
- [滑らかな法線を使用] - 一部のメッシュでは、この設定は省略可能です。 浮き出しは、頂点を頂点の法線に沿って移動することによって発生します。一部のメッシュでは、既定の法線に沿って押し出しを行うと、アウトラインの不連続性が発生します。 これらの不連続性を修正するには、このボックスをオンにして、
MeshSmoother.cs
によって生成される別の滑らかな法線のセットを使用します。
MeshSmoother.cs
は、滑らかな法線をメッシュで自動的に生成するために使用できるコンポーネントです。 このメソッドは、空間内の同じ位置を共有するメッシュ内の頂点をグループ化し、その頂点の法線を平均します。 このプロセスでは、基になるメッシュのコピーが作成され、必要な場合にのみ使用する必要があります。
-
MeshSmoother.cs
によって生成される滑らかな法線。 - 既定の法線が使用されています。キューブの角の周りにある成果物を確認してください。
ステンシル テスト
さまざまな効果を実現するために、構成可能なステンシル テスト サポートが組み込まれています。 ポータルなどがあります。
インスタンス化の色のサポート
数千の GPU インスタンス化メッシュの一意の素材プロパティを提供するため、インスタンス化の色がサポートされます。
Triplanar マッピング
Triplanar マッピングは、プログラムによってメッシュにテクスチャを適用する手法です。 地形、UV を使用しないメッシュ、または図形のラップ解除が困難な場合によく使用されます。 この実装は、ワールド空間またはローカル空間の投影、ブレンドの滑らかさの指定、法線マップをサポートします。 使用される各テクスチャには 3 つのテクスチャ サンプルが必要であるため、パフォーマンス クリティカルな状況では控えめに使用してください。
頂点の浮き出し
ワールド空間の頂点を浮き出します。 浮き出した境界ボリュームや、メッシュのイン/アウトの移行を視覚化する場合に便利です。
その他
Albedo の最適化を制御するチェックボックスです。 Albedo テクスチャが指定されていない場合、最適化の Albedo 操作は無効になります。 これは、リモート テクスチャの読み込みを制御する場合に便利です。
次のチェック ボックスをオンにするだけです。
ピクセルごとのクリッピング テクスチャ、ローカル エッジ ベースのアンチ エイリアシング、法線マップ スケーリングがサポートされています。