MRが楽しい

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

MRTKのStandardシェーダを利用して特定のオブジェクトを常に最前面に描画する

本日は MRTK の小ネタ枠です。
MRTKのStandardシェーダを利用して特定のオブジェクトを常に最前面に描画する方法を記事にします。
f:id:bluebirdofoz:20210907230055j:plain

サンプルプロジェクトの作成

最前面の描画を試すための、MRTK を取り込んだサンプルプロジェクトを作成します。

MRTKのインポートと基本設定

MRTK のインポートと HoloLens 向けプロジェクトの基本設定を行います。
手順の詳細は以下の記事を参照してください。
bluebirdofoz.hatenablog.com

サンプルシーンの準備

以下の MRTKStandard シェーダを設定した2つの Sphere オブジェクトをシーンに配置しました。
デフォルトではオブジェクトの重なり合った部分は隠れて見えないようになっています。
f:id:bluebirdofoz:20210907230112j:plain

常に最前面に表示

緑色側のオブジェクトが常に最前面に表示されるようマテリアル設定を変更してみます。
[RenderingMode]を[Custom]に変更し、[DepthTest]を[Always]に変更します。
f:id:bluebirdofoz:20210907230119j:plain

次に[RenderQueueOverride]の値を[2001]に設定します。
これで緑色側のオブジェクトが常に最前面に表示されるようになります。
f:id:bluebirdofoz:20210907230133j:plain

緑色側の[RenderQueue]の値は必ず、赤色側の[RenderQueue]の値より大きい必要があります。
デフォルトの[-1]では[RenderQueue]に[2000]の値が設定されているため、今回は緑色側に[2001]の値を設定しました。
f:id:bluebirdofoz:20210907230143j:plain

DepthTestのAlways

本設定ではデプスのチェック結果が必ず True となります。
これにより本マテリアルの面は深度の重なりに関わらず、必ず描画が行われます。
www.khronos.org

注意事項

本マテリアルの面は深度の重なりにも関わらず、必ず描画が行われます。
これはオブジェクト自身の前後関係にも当てはまるため、予期しない見た目になることがあります。

一例として以下のような凹みのあるオブジェクトを作成しました。
f:id:bluebirdofoz:20210907230202j:plain

これをシーンに取り込んで作成したマテリアルを適用してみます。
f:id:bluebirdofoz:20210907230209j:plain

すると以下の通り、凹みの内側の面まで深度の影響を受けずに描画が行われてしまい、見た目が変になってしまいます。
f:id:bluebirdofoz:20210907230217j:plain
f:id:bluebirdofoz:20210907230225j:plain

この手法で最前面に表示するオブジェクトを綺麗に表示したい場合は、常に一方から見える面が重ならない形状である必要があります。