クリッピング プリミティブ — MRTK2
ClippingPrimitive
動作は、高性能の plane
、sphere
、box
図形のクリッピングが、MRTK シェーダーでの使用時にクリップするプリミティブの側 (内部または外部) を指定する機能付きで可能になります。
Note
ClippingPrimitives
は、シェーダー内のクリップまたは破棄命令を利用し、クリップされたレンダラーをバッチ処理する Unity の機能を無効にします。 クリッピング プリミティブを利用する場合は、これらのパフォーマンスへの影響を考慮してください。
ClippingPlane.cs
、ClippingSphere.cs
、ClippingBox.cs
を使用して、クリッピング プリミティブ プロパティを簡単に制御できます。 クリッピング シナリオを利用するには、次のシェーダーでこれらのコンポーネントを使用します。
- Mixed Reality ツールキット/Standard
- Mixed Reality ツールキット/TextMeshPro
- Mixed Reality ツールキット/Text3DShader
使用例
ClippingExamples と MaterialGallery の各シーンは、ClippingPrimitive
動作の使用方法を示しており、MRTK/Examples/Demos/StandardShader/Scenes/ で参照できます。
高度な使用方法
既定では、一度に 1 つの ClippingPrimitive
のみが、レンダラーをクリップできます。 プロジェクトで、1 つ以上の ClippingPrimitive
がレンダラーに影響を与える必要がある場合は、次のサンプル コードで実現方法を確認してください。
Note
複数の ClippingPrimitives
クリップを 1 つのレンダラーに含めると、ピクセル シェーダーの命令が増加し、パフォーマンスに影響します。 これらの変更をプロジェクト内でプロファイルしてください。
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
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 コンポーネントをシーンに追加し、両方のボックスに同じレンダラーを指定します。 これで、レンダラーは両方のボックスで同時にクリップされます。