Clipping-Primitive – MRTK2

Die ClippingPrimitive Verhaltensweisen ermöglichen performantes plane, sphere, - und box Shape-Ausschneiden mit der Möglichkeit, anzugeben, für welche Seite des Grundtyps (innen oder außen) abgeschnitten werden soll, wenn sie mit MRTK-Shadern verwendet wird.

Primitive Clipping Gizmos

Hinweis

ClippingPrimitives Verwenden Sie Clip-/Verwerfen-Anweisungen in Shadern und deaktivieren Sie unitys Fähigkeit, beschnittene Renderer zu batchen. Berücksichtigen Sie diese Leistungsauswirkungen beim Verwenden von Clipping-Grundtypen.

ClippingPlane.cs, ClippingSphere.csund ClippingBox.cs können verwendet werden, um einfaches Steuern von primitiven Beschneidungseigenschaften zu steuern. Verwenden Sie diese Komponenten mit den folgenden Shadern, um Clippingszenarien zu nutzen.

  • Mixed Reality Toolkit/Standard
  • Mixed Reality Toolkit/TextMeshPro
  • Mixed Reality Toolkit/Text3DShader

Beispiele

Die Szenen ClippingExamples und MaterialGallery veranschaulichen die Verwendung der ClippingPrimitive Verhaltensweisen und finden Sie unter: MRTK/Examples/Demos/StandardShader/Scenes/

Erweiterte Nutzung

Standardmäßig kann nur einer ClippingPrimitive einen Renderer gleichzeitig ausschneiden. Wenn ihr Projekt mehr als einen ClippingPrimitive benötigt, um einen Renderer zu beeinflussen, zeigt der folgende Beispielcode, wie dies erreicht werden kann.

Hinweis

Wenn Ein Renderer mehrere ClippingPrimitives Clips aufweist, erhöht die Pixel-Shaderanweisungen und wirkt sich auf die Leistung aus. Erstellen Sie ein Profil für diese Änderungen in Ihrem Projekt.

Vorgehensweise: Verwenden von zwei verschiedenen ClippingPrimitives Clips für ein Rendern. Beispiel: und ClippingSphereClippingBox gleichzeitig:

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

Hinweis

Die obige Änderung wird zusätzliche Zeit für die Shader-Kompilierung erfordern.

Hier erfahren Sie, wie Sie zwei von demselben ClippingPrimitives Clip als Rendern verwenden. Beispiel zwei ClippingBoxes gleichzeitig:

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

Fügen Sie ihrer Szene schließlich eine Komponente und eine ClippingBox SecondClippingBox-Komponente hinzu, und geben Sie denselben Renderer für beide Felder an. Der Renderer sollte nun gleichzeitig von beiden Feldern abgeschnitten werden.

Weitere Informationen