Dela via


Översikt över urklipp – MRTK3

Beteendena ClippingPrimitive möjliggör performant plane, sphereoch 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 Grafikverktyg-skuggor.

Exempel på urklipp av primitiva objekt

Anteckning

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

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

  • Grafikverktyg/Standard
  • Grafikverktyg/Text mesh Pro
  • Grafikverktyg/Wireframe
  • Grafikverktyg/Wireframe
  • Grafikverktyg/icke-arbetsyte-/backplate
  • Grafikverktyg/icke-arbetsyte-/frontplate
  • Grafikverktyg/icke-arbetsyte-/ljussken
  • Grafikverktyg/icke-arbetsyte-/quad-ljussken
  • Grafikverktyg/ej arbetsytor/fasade

Avancerad användning

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

Anteckning

Om du har flera ClippingPrimitiveklipper en renderare ökar pixelskuggningsinstruktionerna 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 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

Anteckning

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

Hur man har två av samma ClippingPrimitiveklipp en återgivning. Till exempel två ClippingBoxespå samma gång:

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

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

Se även