Vue d’ensemble de la primitive de découpage — MRTK3
Les comportements ClippingPrimitive
permettent un découpage performant des formes plane
, sphere
et 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.
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.