Primitiva di ritaglio - MRTK2
I ClippingPrimitive
comportamenti consentono il ritaglio di forme, , sphere
e box
performanti plane
con la possibilità di specificare il lato della primitiva da ritagliare (all'interno o all'esterno) se usato con gli shader MRTK.
Nota
ClippingPrimitives
usare le istruzioni clip/discard all'interno degli shader e disabilitare la capacità di Unity di renderer ritagliati in batch. Prendere in considerazione queste implicazioni per le prestazioni quando si usano primitive di ritaglio.
ClippingPlane.cs
, ClippingSphere.cs
e ClippingBox.cs
possono essere usati per controllare facilmente le proprietà primitive di ritaglio. Usare questi componenti con gli shader seguenti per sfruttare gli scenari di ritaglio.
- Realtà mista Toolkit/Standard
- Realtà mista Toolkit/TextMeshPro
- Realtà mista Toolkit/Text3DShader
Esempi
Le scene ClippingExamples e MaterialGallery illustrano l'utilizzo ClippingPrimitive
dei comportamenti e sono disponibili in: MRTK/Examples/Demos/StandardShader/Scenes/
Utilizzo avanzato
Per impostazione predefinita, solo uno ClippingPrimitive
può ritagliarne uno alla volta. Se il progetto richiede più di uno ClippingPrimitive
per influenzare un renderer , il codice di esempio seguente illustra come ottenere questo risultato.
Nota
La presenza di più ClippingPrimitives
clip in un renderer aumenterà le istruzioni per il pixel shader e influirà sulle prestazioni. Profilare queste modifiche all'interno del progetto.
Come avere due clip diverse ClippingPrimitives
per un rendering. Ad esempio, e ClippingSphere
ClippingBox
contemporaneamente:
// 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
Nota
La modifica precedente incorrerà in un tempo di compilazione aggiuntivo dello shader.
Come eseguire il rendering di due della stessa ClippingPrimitives
clip. Ad esempio due ClippingBoxes
contemporaneamente:
// 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
Infine, aggiungere un ClippingBox
componente e SecondClippingBox alla scena e specificare lo stesso renderer per entrambe le caselle. Il renderer dovrebbe ora essere ritagliato da entrambe le caselle contemporaneamente.