Clipping primitive — MRTK2
Les ClippingPrimitive
comportements permettent un découpage de forme performant 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 des nuanceurs MRTK.
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.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 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 ClippingSphere
ClippingBox
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.