Dela via


Urklipp – MRTK2

Beteendena ClippingPrimitive möjliggör performant plane, sphere, och box formurklipp med möjlighet att ange vilken sida av primitiven som ska klippas mot (inuti eller utanför) när den används med MRTK-skuggor.

primitiv urklipp gizmos

Anteckning

ClippingPrimitives använd instruktioner för klipp/ignorera i skuggor och inaktivera Unitys möjlighet att batchklippta renderare. Tänk på de här prestandakonsekvenserna när du använder urklippsprimitiver.

ClippingPlane.cs, ClippingSphere.csoch ClippingBox.cs kan användas för att enkelt styra urklipps primitiva egenskaper. Använd dessa komponenter med följande skuggor för att utnyttja urklippsscenarier.

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

Exempel

ClippingExamples- och MaterialGallery-scenerna visar hur ClippingPrimitive beteendet används och finns på: MRTK/Examples/Demos/StandardShader/Scenes/

Avancerad användning

Som standard kan bara en ClippingPrimitive klippa en renderare i taget. Om projektet kräver mer än en ClippingPrimitive för att påverka en renderare visar exempelkoden nedan hur du kan uppnå detta.

Anteckning

Om en renderare har flera ClippingPrimitives klipp ökar instruktionerna för pixelskuggning och prestandan påverkas. Profilera ändringarna i projektet.

Hur man har två olika ClippingPrimitives klipp en återgivning. Till exempel en ClippingSphere och ClippingBox på samma gång:

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

Anteckning

Ovanstående ändring medför ytterligare kompileringstid för skuggning.

Så här har du två av samma ClippingPrimitives klipp som en återgivning. Till exempel två ClippingBoxes på samma gång:

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

Lägg slutligen till en ClippingBox och SecondClippingBox-komponent i din scen och ange samma renderare för båda rutorna. Återgivningen bör nu klipps av båda rutorna samtidigt.

Se även