Primitief knippen — MRTK2

Het ClippingPrimitive gedrag maakt het mogelijk om een goed presterende plane, sphereen box shape-knipsel te maken met de mogelijkheid om op te geven tegen welke kant van de primitieve het object moet worden afgeknipt (binnen of buiten) bij gebruik met MRTK-shaders.

primitieve knipsels gizmos

Notitie

ClippingPrimitives gebruik instructies voor knippen/verwijderen in shaders en schakel de mogelijkheid van Unity uit om batchgeknipte renderers in batches uit te schakelen. Houd rekening met deze gevolgen voor de prestaties bij het gebruik van primitieven voor knippen.

ClippingPlane.cs, ClippingSphere.csen ClippingBox.cs kunnen worden gebruikt om eenvoudig primitieve eigenschappen van het knippen te beheren. Gebruik deze onderdelen met de volgende shaders om gebruik te maken van knipscenario's.

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

Voorbeelden

De scènes ClippingExamples en MaterialGallery laten het gebruik van het ClippingPrimitive gedrag zien en zijn te vinden op: MRTK/Examples/Demos/StandardShader/Scenes/

Geavanceerd gebruik

Standaard kan slechts één ClippingPrimitivekeer een renderer tegelijk knippen . Als uw project meer dan één ClippingPrimitive nodig heeft om een renderer te beïnvloeden, laat de onderstaande voorbeeldcode zien hoe u dit kunt bereiken.

Notitie

Als u meerdere ClippingPrimitives clip's gebruikt, verhoogt een renderer de instructies voor pixel-shader en is dit van invloed op de prestaties. Profileer deze wijzigingen binnen uw project.

Twee verschillende ClippingPrimitives clipweergaven weergeven. Bijvoorbeeld een ClippingSphere en ClippingBox tegelijkertijd:

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

Notitie

Voor de bovenstaande wijziging krijgt u extra tijd voor het compileren van arceringen.

Twee van dezelfde ClippingPrimitives clip weergeven. Bijvoorbeeld twee ClippingBoxes tegelijk:

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

Voeg ten slotte een ClippingBox en SecondClippingBox-onderdeel toe aan uw scène en geef dezelfde renderer op voor beide vakken. De renderer moet nu door beide vakken tegelijk worden afgeknipt.

Zie ook