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

ClippingPrimitiveこれらの動作により、 plane sphere box mrtk シェーダーで使用する場合に、クリップするプリミティブの側 (内部または外部) を指定する機能を備えた、パフォーマンスの高い、、および形状のクリッピングが可能になります。

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

注意

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

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

  • Mixed Reality Toolkit/標準
  • Mixed Reality Toolkit/TextMeshPro
  • Mixed Reality Toolkit/text3dshader

ClippingExamplesMaterialGallery のシーンは動作の使用方法 ClippingPrimitive を示しており、Mrtk/例/デモ/standardshader/シーン/で参照できます。

高度な使用方法

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

注意

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

2つ ClippingPrimitives の異なるクリップを表示する方法。たとえば、 ClippingSphere とは ClippingBox 次のようになります。

// 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

注意

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

同じクリップの2つを表示する方法 ClippingPrimitives 。同時に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 コンポーネントをシーンに追加し、両方のボックスに同じレンダラーを指定します。 レンダラーは、両方のボックスに同時にクリップされるようになりました。

こちらもご覧ください