Primitief knippen — MRTK2
Het ClippingPrimitive
gedrag maakt het mogelijk om een goed presterende plane
, sphere
en box
shape-knipsel te maken met de mogelijkheid om op te geven tegen welke kant van de primitieve het object moet worden afgeknipt (binnen of buiten) bij gebruik met MRTK-shaders.
Notitie
ClippingPrimitives
gebruik instructies voor knippen/verwijderen in shaders en schakel de mogelijkheid van Unity uit om batchgeknipte renderers in batches uit te schakelen. Houd rekening met deze gevolgen voor de prestaties bij het gebruik van primitieven voor knippen.
ClippingPlane.cs
, ClippingSphere.cs
en ClippingBox.cs
kunnen worden gebruikt om eenvoudig primitieve eigenschappen van het knippen te beheren. Gebruik deze onderdelen met de volgende shaders om gebruik te maken van knipscenario's.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Voorbeelden
De scènes ClippingExamples en MaterialGallery laten het gebruik van het ClippingPrimitive
gedrag zien en zijn te vinden op: MRTK/Examples/Demos/StandardShader/Scenes/
Geavanceerd gebruik
Standaard kan slechts één ClippingPrimitive
keer een renderer tegelijk knippen . Als uw project meer dan één ClippingPrimitive
nodig heeft om een renderer te beïnvloeden, laat de onderstaande voorbeeldcode zien hoe u dit kunt bereiken.
Notitie
Als u meerdere ClippingPrimitives
clip's gebruikt, verhoogt een renderer de instructies voor pixel-shader en is dit van invloed op de prestaties. Profileer deze wijzigingen binnen uw project.
Twee verschillende ClippingPrimitives
clipweergaven weergeven. Bijvoorbeeld een ClippingSphere
en ClippingBox
tegelijkertijd:
// 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
Notitie
Voor de bovenstaande wijziging krijgt u extra tijd voor het compileren van arceringen.
Twee van dezelfde ClippingPrimitives
clip weergeven. Bijvoorbeeld twee ClippingBoxes
tegelijk:
// 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
Voeg ten slotte een ClippingBox
en SecondClippingBox-onderdeel toe aan uw scène en geef dezelfde renderer op voor beide vakken. De renderer moet nu door beide vakken tegelijk worden afgeknipt.