Zuschnitt-Primitiv

Die Verhaltensweisen ermöglichen eine performante , - und -Formausschneidung mit der Möglichkeit, anzugeben, auf welcher Seite des Primitivs (innerhalb oder außerhalb) abgeschnitten werden soll, wenn sie mit ClippingPrimitiveplanespherebox MRTK-Shadern verwendet wird.

Primitive Clipping-Klammern

Hinweis

ClippingPrimitives Verwenden ClippingPrimitives in Shadern, und deaktivieren Sie die Fähigkeit von Unity, abgeschnittene Renderer als Batch zu verwenden. Berücksichtigen Sie diese Auswirkungen auf die Leistung bei der Verwendung von Clippingprimitiven.

ClippingPlane.cs, ClippingSphere.cs und können verwendet ClippingBox.cs werden, um primitive Clippingeigenschaften 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 ClippingExamples- und MaterialGallery-Szenen veranschaulichen die Verwendung des Verhaltens und finden Sie unter: MRTK/Examples/Demos/StandardShader/Scenes/

Erweiterte Nutzung

Standardmäßig kann nur ein ClippingPrimitiveClippingPrimitive abgeschnitten werden. Wenn ihr Projekt mehr als einen benötigt, um einen Renderer zu beeinflussen, veranschaulicht der folgende Beispielcode, ClippingPrimitive wie dies erreicht werden kann. ClippingPrimitive

Hinweis

Wenn ein ClippingPrimitives Renderer mehrere ClippingPrimitives werden die Anweisungen für den Pixel-Shader erhöht, und dies wirkt sich auf die Leistung aus. Erstellen Sie ein Profil für diese Änderungen in Ihrem Projekt.

Zwei unterschiedliche ClippingPrimitives Clips für ein Rendern. Beispiel: ClippingSphere und ClippingBox zur gleichen Zeit:

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

Durch die obige Änderung kommt es zu einer zusätzlichen Shaderkompilierungszeit.

Es wird dargestellt, wie Zwei desselben ClippingPrimitives Clips ein Rendern. 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 abschließend ihrer Szene eine - und eine SecondClippingBox-Komponente hinzu, und geben ClippingBox Sie denselben Renderer für beide Felder an. Der Renderer sollte nun von beiden Feldern gleichzeitig abgeschnitten werden.

Weitere Informationen