Übersicht über Clipping-Grundtypen — MRTK3

Die ClippingPrimitive-Verhaltensweisen ermöglichen ein leistungsfähiges plane-, sphere- und box-Shape-Clipping mit der Möglichkeit festzulegen, an welcher Seite des Grundtyps geclippt werden soll (innen oder außen), wenn es mit Grafiktools-Shadern verwendet wird.

Clipping primitive example

Hinweis

ClippingPrimitives verwenden Clip/Verwerfungs-Befehle in Shadern und deaktivieren die Fähigkeit von Unity, geclippte Renderer zu stapeln. Berücksichtigen Sie diese Leistungsauswirkungen beim Verwenden von Clipping-Grundtypen.

ClippingPlane.cs, ClippingSphere.cs und ClippingBox.cs können verwendet werden, um ClippingPlane.cs ganz einfach zu steuern. Verwenden Sie diese Komponenten mit den folgenden Shadern, um Clippingszenarien zu verwenden.

  • Grafiktools/Standard
  • Grafiktools/TextGitter Pro
  • Grafiktools/Drahtmodell
  • Grafiktools/Drahtmodell
  • Grafiktools/Nicht-Canvas/Backplate
  • Grafiktools/Nicht-Canvas/Frontplate
  • Grafiktools/Nicht-Canvas/Glow
  • Grafiktools/Nicht-Canvas/Quad Glow
  • Grafiktools/Nicht-Canvas/Beveled

Erweiterte Verwendung

Standardmäßig kann nur ein ClippingPrimitive Renderer einen Renderer zur gleichen Zeit ausschneiden. Wenn Ihr Projekt mehr als einen ClippingPrimitive benötigt, um einen Renderer zu beeinflussen, zeigt der nachstehende Beispielcode, wie dies erreicht werden kann.

Hinweis

Wenn Sie einen Renderer mit mehreren ClippingPrimitives clippen, erhöht sich die Anzahl der Pixel-Shader-Anweisungen, was sich auf die Leistung auswirkt. Erstellen Sie in Ihrem Projekt ein Profil für diese Änderungen.

Wie man zwei verschiedene ClippingPrimitives in einem Rendering rendert. Zum Beispiel, ein ClippingSphere und ClippingBox gleichzeitig:

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

Hinweis

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

Wie man zwei gleiche ClippingPrimitives in einem Rendering ausschneidet. Zum Beispiel, zwei ClippingBoxesgleichzeitig:

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

Fügen Sie schließlich Ihrer Szene eine ClippingBox und 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