Primitiva di ritaglio

I comportamenti consentono il ritaglio delle forme performanti , e con la possibilità di specificare il lato della primitiva su cui ritagliare (all'interno o all'esterno) quando viene usato con ClippingPrimitive plane shader sphere box MRTK.

gizmo di ritaglio primitivo

Nota

ClippingPrimitives usare le istruzioni clip/discard all'interno degli shader e disabilitare la possibilità di Unity di troncato in batch. Tenere presenti queste implicazioni in termini di prestazioni quando si utilizzano primitive di ritaglio.

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

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

Esempio

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

Utilizzo avanzato

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

Nota

La presenza ClippingPrimitives di più clip di un renderer aumenta pixel shader istruzioni e influisce sulle prestazioni. Profilare queste modifiche all'interno del progetto.

Come fare in modo che due ClippingPrimitives clip diversi eseere un rendering. Ad esempio, ClippingSphere e ClippingBox 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 comporta un tempo di compilazione dello shader aggiuntivo.

Come fare in modo che due dello stesso ClippingPrimitives clip esere un rendering. 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.

Vedi anche