Primitivo de recorte: MRTK2
Los ClippingPrimitive
comportamientos permiten el recorte de formas , sphere
y box
con plane
la capacidad de especificar en qué lado del primitivo se va a recortar (dentro o fuera) cuando se usa con sombreadores MRTK.
Nota
ClippingPrimitives
use instrucciones de recorte o descarte dentro de los sombreadores y deshabilite la capacidad de Unity para los representadores recortados por lotes. Tenga en cuenta estas implicaciones de rendimiento al usar primitivos de recorte.
ClippingPlane.cs
, ClippingSphere.cs
y ClippingBox.cs
se pueden usar para controlar fácilmente las propiedades primitivas de recorte. Use estos componentes con los siguientes sombreadores para aprovechar los escenarios de recorte.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Ejemplos
Las escenas ClippingExamples y MaterialGallery muestran el uso de los ClippingPrimitive
comportamientos y se pueden encontrar en: MRTK/Examples/Demos/StandardShader/Scenes/
Uso avanzado
De forma predeterminada, solo se ClippingPrimitive
puede recortar un representador a la vez. Si el proyecto requiere más de uno ClippingPrimitive
para influir en un representador , el código de ejemplo siguiente muestra cómo lograrlo.
Nota
Tener varios ClippingPrimitives
clips en un representador aumentará las instrucciones del sombreador de píxeles y afectará al rendimiento. Describa estos cambios dentro del proyecto.
Cómo tener dos clips diferentes ClippingPrimitives
en una representación. Por ejemplo, y ClippingSphere
ClippingBox
al mismo tiempo:
// 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
El cambio anterior supone un tiempo de compilación adicional del sombreador.
Cómo tener dos de los mismos ClippingPrimitives
clips una representación. Por ejemplo, dos ClippingBoxes
al mismo tiempo:
// 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
Por último, agregue un ClippingBox
componente SecondClippingBox a la escena y especifique el mismo representador para ambos cuadros. El representador ahora debería recortarse mediante ambos cuadros simultáneamente.