Freigeben über


Beschneidungsgrundtyp – MRTK2

Die ClippingPrimitive Verhaltensweisen ermöglichen leistungsfähiges plane, sphere- und box -Shape-Clipping mit der Möglichkeit, anzugeben, welche Seite des Grundtyps bei Verwendung mit MRTK-Shadern (innen oder außerhalb) abgeschnitten werden soll.

Primitive Clipping Gizmos

Hinweis

ClippingPrimitives Verwenden Sie Clip/Discard-Anweisungen in Shadern und deaktivieren Sie die Möglichkeit von Unity, beschnittene Renderer in Batches zu batchen. Berücksichtigen Sie diese Auswirkungen auf die Leistung bei der Verwendung von Beschneidungsgrundtypen.

ClippingPlane.cs, ClippingSphere.csund ClippingBox.cs können verwendet werden, um beschneidungsprimitive Eigenschaften einfach 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 Verwendung

Standardmäßig kann nur einer ClippingPrimitive einen Renderer gleichzeitig ausschneiden. Wenn ihr Projekt mehrere ClippingPrimitive Erfordert, um einen Renderer zu beeinflussen, zeigt der folgende Beispielcode, wie dies erreicht wird.

Hinweis

Wenn sie einen Renderer mit mehreren ClippingPrimitives Clips ausschneiden, werden die Anweisungen zum Pixelshader erhöht und die Leistung beeinträchtigt. Bitte profilieren Sie diese Änderungen in Ihrem Projekt.

Vorgehensweise beim Rendern von zwei verschiedenen ClippingPrimitives Clips. 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 führt zu zusätzlicher Shaderkompilierungszeit.

So wird's beschrieben, wie sie zwei desselben ClippingPrimitives Clips für ein 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 jetzt von beiden Feldern gleichzeitig abgeschnitten werden.

Siehe auch