クリッピング プリミティブの概要 — MRTK3

ClippingPrimitive 動作は、高性能の planespherebox 図形のクリッピングが、グラフィックツール シェーダーでの使用時にクリップするプリミティブの側 (内部または外部) を指定する機能付きで可能になります。

クリッピング プリミティブの例

注意

ClippingPrimitive は、シェーダー内のクリップ/破棄命令を利用し、クリップされたレンダラーをバッチ処理する Unity の機能を無効にします。 クリッピング プリミティブを利用する場合は、これらのパフォーマンスへの影響を考慮してください。

クリッピング プリミティブ プロパティを簡単にコントロールするには、ClippingPlane.csClippingSphere.cs、および ClippingBox.cs を使用できます。 クリッピング シナリオを利用するには、次のシェーダーでこれらのコンポーネントを使用します。

  • グラフィックス ツール/標準
  • グラフィックス ツール/テキストメッシュプロ
  • グラフィックス ツール/ワイヤフレーム
  • グラフィックス ツール/ワイヤフレーム
  • グラフィック ツール/キャンバス以外/バック プレート
  • グラフィック ツール/キャンバス以外/フロントプレート
  • グラフィック ツール/キャンバス以外/白熱光
  • グラフィック ツール/キャンバス以外/クワッド 白熱光
  • グラフィックツール/キャンバス以外/ベベル

詳細な使用方法

既定では、一度に 1 つの ClippingPrimitive のみが、レンダラーをクリップできます。 プロジェクトで、1 つ以上の ClippingPrimitiveレンダラーに影響を与える必要がある場合は、次のサンプル コードで実現方法を確認してください。

注意

複数の ClippingPrimitiveレンダラーをクリップさせると、ピクセル シェーダーの命令を増加し、パフォーマンスに影響します。 これらの変更をプロジェクト内でプロファイルしてください。

2 つの異なる ClippingPrimitiveがレンダーを クリップさせる方法。 たとえば、ClippingSphereClippingBoxは同時に次のようになります:

// Within GraphicsToolsStandard.shader (or another Graphics Tools shader that supports clipping primitives) change:

#pragma multi_compile_local _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX

// to:

#pragma multi_compile_local _ _CLIPPING_PLANE
#pragma multi_compile_local _ _CLIPPING_SPHERE
#pragma multi_compile_local _ _CLIPPING_BOX

Note

上記の変更により、シェーダーのコンパイル時間が増加します。

2 つの同じ ClippingPrimitiveにレンダーを クリップさせる方法。 たとえば、2つのClippingBoxesは同時に次のようになります:

// 1) Add the below MonoBehaviour to your project:

using UnityEngine;
using Microsoft.MixedReality.GraphicsTools;

[ExecuteInEditMode]
public class SecondClippingBox : ClippingBox
{
    /// <inheritdoc />
    protected override string Keyword
    {
        get { return "_CLIPPING_BOX2"; }
    }

    /// <inheritdoc />
    protected override string ClippingSideProperty
    {
        get { return "_ClipBoxSide2"; }
    }

    /// <inheritdoc />
    protected override void Initialize()
    {
        base.Initialize();

        clipBoxInverseTransformID = Shader.PropertyToID("_ClipBoxInverseTransform2");
    }
}


// 2) Within GraphicsToolsStandard.shader add the following multi_compile pragma:

#pragma multi_compile_local _ _CLIPPING_BOX2

// 3) In GraphicsToolsStandardInput.hlsl add the following shader variables:

#if defined(_CLIPPING_BOX2)
    half _ClipBoxSide2;
    float4x4 _ClipBoxInverseTransform2;
#endif

// 4) In GraphicsToolsStandardProgram.hlsl change:

#if defined(_CLIPPING_PLANE) || defined(_CLIPPING_SPHERE) || defined(_CLIPPING_BOX)

// to:

#if defined(_CLIPPING_PLANE) || defined(_CLIPPING_SPHERE) || defined(_CLIPPING_BOX) || defined(_CLIPPING_BOX2)

// 5) In the same shader change:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif

// to:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif
#if defined(_CLIPPING_BOX2)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.xyz, _ClipBoxInverseTransform2) * _ClipBoxSide2);
#endif

最後に、ClippingBoxSecondClippingBoxコンポーネントをシーンに追加し、両方のボックスに同じレンダラーを指定します。 これで、レンダラーは両方のボックスで同時にクリップされます。

関連項目