Partager via


Clipping primitive — MRTK2

Les ClippingPrimitive comportements permettent un découpage de forme performant 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 des nuanceurs MRTK.

gizmos de découpage primitif

Notes

ClippingPrimitives utiliser des instructions de découpage/d’abandon dans les nuanceurs et désactiver la capacité d’Unity à effectuer des rendus clippés par lots. Prenez en compte ces implications en matière de performances lors de l’utilisation des primitives de découpage.

ClippingPlane.cs, ClippingSphere.cset 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 tirer parti des scénarios de découpage.

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

Exemples

Les scènes ClippingExamples et MaterialGallery illustrent l’utilisation ClippingPrimitive des comportements, et sont disponibles à l’adresse : MRTK/Examples/Demos/StandardShader/Scenes/

Utilisation avancée

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

Notes

Le fait d’avoir plusieurs ClippingPrimitives clip a pour effet d’augmenter les instructions du nuanceur de pixels et d’avoir un impact sur les performances. Profilez ces changements dans votre projet.

Comment avoir deux clip différents ClippingPrimitives un rendu. Par exemple, et ClippingSphereClippingBox en même temps :

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

Notes

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

Comment avoir deux du même ClippingPrimitives clip un rendu. Par exemple deux ClippingBoxes en même temps :

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

Enfin, ajoutez un ClippingBox composant et SecondClippingBox à votre scène et spécifiez le même convertisseur pour les deux zones. Le convertisseur doit maintenant être coupé simultanément par les deux zones.

Voir aussi