クリッピング プリミティブの概要 — MRTK3
ClippingPrimitive
動作は、高性能の plane
、sphere
、box
図形のクリッピングが、グラフィックツール シェーダーでの使用時にクリップするプリミティブの側 (内部または外部) を指定する機能付きで可能になります。
注意
ClippingPrimitive
は、シェーダー内のクリップ/破棄命令を利用し、クリップされたレンダラーをバッチ処理する Unity の機能を無効にします。 クリッピング プリミティブを利用する場合は、これらのパフォーマンスへの影響を考慮してください。
クリッピング プリミティブ プロパティを簡単にコントロールするには、ClippingPlane.cs、ClippingSphere.cs、および ClippingBox.cs を使用できます。 クリッピング シナリオを利用するには、次のシェーダーでこれらのコンポーネントを使用します。
- グラフィックス ツール/標準
- グラフィックス ツール/テキストメッシュプロ
- グラフィックス ツール/ワイヤフレーム
- グラフィックス ツール/ワイヤフレーム
- グラフィック ツール/キャンバス以外/バック プレート
- グラフィック ツール/キャンバス以外/フロントプレート
- グラフィック ツール/キャンバス以外/白熱光
- グラフィック ツール/キャンバス以外/クワッド 白熱光
- グラフィックツール/キャンバス以外/ベベル
詳細な使用方法
既定では、一度に 1 つの ClippingPrimitive
のみが、レンダラーをクリップできます。 プロジェクトで、1 つ以上の ClippingPrimitive
がレンダラーに影響を与える必要がある場合は、次のサンプル コードで実現方法を確認してください。
注意
複数の ClippingPrimitive
にレンダラーをクリップさせると、ピクセル シェーダーの命令を増加し、パフォーマンスに影響します。 これらの変更をプロジェクト内でプロファイルしてください。
2 つの異なる ClippingPrimitive
がレンダーを クリップさせる方法。 たとえば、ClippingSphere
と ClippingBox
は同時に次のようになります:
// 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
最後に、ClippingBox
と SecondClippingBox
コンポーネントをシーンに追加し、両方のボックスに同じレンダラーを指定します。 これで、レンダラーは両方のボックスで同時にクリップされます。