Ritaglio primitivo - MRTK2
I ClippingPrimitive
comportamenti consentono di ritagliare in modo efficiente plane
, sphere
e box
forma con la possibilità di specificare il lato della primitiva da ritagliare (all'interno o all'esterno) quando usato con gli shader MRTK.
Nota
ClippingPrimitives
usare istruzioni clip /scarta all'interno di shader e disabilitare la possibilità di eseguire il rendering ritagliato in batch di Unity. Prendere in considerazione queste implicazioni sulle prestazioni quando si usano primitive di ritaglio.
ClippingPlane.cs
, ClippingSphere.cs
e ClippingBox.cs
può essere usato 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
Esempio
Le scene ClippingExamples e MaterialGallery illustrano l'utilizzo dei ClippingPrimitive
comportamenti e sono disponibili in: MRTK/Examples/Demos/StandardShader/Scenes/
Utilizzo avanzato
Per impostazione predefinita, è ClippingPrimitive
possibile ritagliarne un renderer alla volta. Se il progetto richiede più di uno ClippingPrimitive
per influenzare un renderer il codice di esempio riportato di seguito illustra come ottenere questo risultato.
Nota
La presenza di più ClippingPrimitives
clip di un renderer aumenterà le istruzioni del pixel shader e avrà effetto sulle prestazioni. Profila queste modifiche all'interno del progetto.
Come avere due clip diverse ClippingPrimitives
. Ad esempio, un ClippingSphere
oggetto e 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 comporta un tempo di compilazione di shader aggiuntivo.
Come avere due dello stesso ClippingPrimitives
clip un rendering. 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 deve ora essere ritagliato contemporaneamente da entrambe le caselle.