Condividi tramite


Primitiva di ritaglio - MRTK2

I ClippingPrimitive comportamenti consentono il ritaglio di forme, , spheree box performanti planecon la possibilità di specificare il lato della primitiva da ritagliare (all'interno o all'esterno) se usato con gli shader MRTK.

gizmos di ritaglio primitivo

Nota

ClippingPrimitives usare le istruzioni clip/discard all'interno degli shader e disabilitare la capacità di Unity di renderer ritagliati in batch. Prendere in considerazione queste implicazioni per le prestazioni quando si usano primitive di ritaglio.

ClippingPlane.cs, ClippingSphere.cse ClippingBox.cs possono essere usati per controllare facilmente le proprietà primitive di ritaglio. Usare questi componenti con gli shader seguenti per sfruttare gli scenari di ritaglio.

  • Realtà mista Toolkit/Standard
  • Realtà mista Toolkit/TextMeshPro
  • Realtà mista Toolkit/Text3DShader

Esempi

Le scene ClippingExamples e MaterialGallery illustrano l'utilizzo ClippingPrimitive dei comportamenti e sono disponibili in: MRTK/Examples/Demos/StandardShader/Scenes/

Utilizzo avanzato

Per impostazione predefinita, solo uno ClippingPrimitive può ritagliarne uno alla volta. Se il progetto richiede più di uno ClippingPrimitive per influenzare un renderer , il codice di esempio seguente illustra come ottenere questo risultato.

Nota

La presenza di più ClippingPrimitives clip in un renderer aumenterà le istruzioni per il pixel shader e influirà sulle prestazioni. Profilare queste modifiche all'interno del progetto.

Come avere due clip diverse ClippingPrimitives per un rendering. Ad esempio, e ClippingSphereClippingBox contemporaneamente:

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

Nota

La modifica precedente incorrerà in un tempo di compilazione aggiuntivo dello shader.

Come eseguire il rendering di due della stessa ClippingPrimitives clip. Ad esempio due ClippingBoxes contemporaneamente:

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

Infine, aggiungere un ClippingBox componente e SecondClippingBox alla scena e specificare lo stesso renderer per entrambe le caselle. Il renderer dovrebbe ora essere ritagliato da entrambe le caselle contemporaneamente.

Vedere anche