Condividi tramite


Panoramica delle primitive di ritaglio - MRTK3

I ClippingPrimitive comportamenti consentono di ritagliare in modo efficiente plane, spheree box forma con la possibilità di specificare il lato della primitiva da ritagliare (all'interno o all'esterno) quando usato con gli shader degli strumenti grafici.

Esempio primitivo di clipping

Nota

ClippingPrimitiveusa istruzioni clip /rimuovi all'interno di shader e disabilita la possibilità di eseguire il rendering ritagliato in batch di Unity. Prendere in considerazione queste implicazioni sulle prestazioni quando si usano primitive di ritaglio.

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

  • Strumenti grafici/Standard
  • Strumenti grafici/Testo Mesh Pro
  • Strumenti grafici/wireframe
  • Strumenti grafici/wireframe
  • Strumenti grafici/Non-Canvas/Backplate
  • Strumenti grafici/Non-Canvas/Frontplate
  • Strumenti grafici/Non Canvas/Glow
  • Strumenti grafici/Non-Canvas/Quad Glow
  • Strumenti grafici/Non canvas/Beveled

Uso avanzato

Per impostazione predefinita, è possibile ClippingPrimitive ritagliarne un renderer alla volta. Se il progetto richiede più di un ClippingPrimitiverenderer il codice di esempio riportato di seguito illustra come ottenere questo risultato.

Nota

La presenza di più ClippingPrimitiveclip di un renderer aumenterà le istruzioni del pixel shader e avrà effetto sulle prestazioni. Profila queste modifiche all'interno del progetto.

Come avere due clip diverse ClippingPrimitivedi un rendering. Ad esempio, un ClippingSphere e ClippingBox contemporaneamente:

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

Nota

La modifica precedente comporta un tempo di compilazione di shader aggiuntivo.

Come avere due delle stesse ClippingPrimitiveclip di un rendering. Ad esempio due ClippingBoxescontemporaneamente:

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

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

Vedi anche