クリッピング プリミティブ — MRTK2

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

プリミティブ クリッピング ギズモ

Note

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

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

  • Mixed Reality ツールキット/Standard
  • Mixed Reality ツールキット/TextMeshPro
  • Mixed Reality ツールキット/Text3DShader

使用例

ClippingExamplesMaterialGallery の各シーンは、ClippingPrimitive 動作の使用方法を示しており、MRTK/Examples/Demos/StandardShader/Scenes/ で参照できます。

高度な使用方法

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

Note

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

2 つの異なる ClippingPrimitives クリップをレンダリングする方法。 ClippingSphereClippingBox を同時に設定する例は次のとおりです。

// Within MRTK/Core/StandardAssets/Shaders/MixedRealityStandard.shader (or another MRTK shader) change:

#pragma multi_compile _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX

// to:

#pragma multi_compile _ _CLIPPING_PLANE
#pragma multi_compile _ _CLIPPING_SPHERE
#pragma multi_compile _ _CLIPPING_BOX

Note

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

同じ ClippingPrimitives の 2 つのクリップを 1 つにレンダリングする方法。 2 つの ClippingBoxes を同時に設定する例を次に示します。

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

[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();

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

// 2) Within MRTK/Core/StandardAssets/Shaders/MixedRealityStandard.shader (or another MRTK shader) add the following multi_compile pragma:

#pragma multi_compile _ _CLIPPING_BOX2

// 3) In the same shader 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)

// 4) In the same shader add the following shader variables:

#if defined(_CLIPPING_BOX2)
    fixed _ClipBoxSide2;
    float4 _ClipBoxSize2;
    float4x4 _ClipBoxInverseTransform2;
#endif

// 5) In the same shader change:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif

// to:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif
#if defined(_CLIPPING_BOX2)
    primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize2.xyz, _ClipBoxInverseTransform2) * _ClipBoxSide2);
#endif

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

関連項目