Vue d’ensemble de la primitive de découpage — MRTK3

Les comportements ClippingPrimitive permettent un découpage performant des formes plane, sphereet box avec la possibilité de spécifier le côté de la primitive à découper (à l’intérieur ou à l’extérieur) lorsqu’il est utilisé avec les nuanceurs Graphics Tools.

Exemple de découpage primitif

Notes

ClippingPrimitive utilisent des instructions détourer/annuler dans les nuanceurs et désactive la capacité d’Unity à découper les convertisseurs par lots. Prenez en compte ces implications en matière de performances lors de l’utilisation des primitives de découpage.

ClippingPlane.cs, ClippingSphere.cs et ClippingBox.cs peuvent être utilisés pour contrôler facilement les propriétés primitives de découpage. Utilisez ces composants avec les nuanceurs suivants pour utiliser des scénarios de découpage.

  • Graphics Tools/Standard
  • Graphics Tools/Text Mesh Pro
  • Graphics Tools/Wireframe
  • Graphics Tools/Wireframe
  • Graphics Tools/Non-Canvas/Backplate
  • Graphics Tools/Non-Canvas/Frontplate
  • Graphics Tools/Non-Canvas/Glow
  • Graphics Tools/Non-Canvas/Quad Glow
  • Graphics Tools/Non-Canvas/Beveled

Utilisation avancée

Par défaut, un seul peut ClippingPrimitive découper un convertisseur à la fois. Si votre projet nécessite plusieurs ClippingPrimitive pour influencer un convertisseur, l’exemple de code ci-dessous montre comment procéder.

Notes

Le fait d’avoir plusieurs ClippingPrimitive pour détourer un convertisseur augmente les instructions du nuanceur de pixels et impacte les performances. Profilez ces changements dans votre projet.

Comment détourer un rendu avec deux ClippingPrimitive différents. Par exemple, un ClippingSphere et ClippingBox en même temps :

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

Notes

La modification ci-dessus entraîne une durée de compilation supplémentaire du nuanceur.

Comment détourer un rendu avec deux ClippingPrimitive similaires. Par exemple, deux ClippingBoxes en même temps :

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

Enfin, ajoutez ClippingBox et SecondClippingBox spécifiez le même convertisseur pour les deux zones. Le convertisseur doit maintenant être coupé simultanément par les deux zones.

Voir aussi