Primitiva de recorteClipping primitive

Los comportamientos permiten el recorte de formas , y con la capacidad de especificar en qué lado de la primitiva se va a recortar (dentro o fuera) cuando se usa con sombreadores ClippingPrimitive plane sphere box MRTK.The ClippingPrimitive behaviors allow for performant plane, sphere, and box shape clipping with the ability to specify which side of the primitive to clip against (inside or outside) when used with MRTK shaders.

gizmos de recorte primitivo

Nota

ClippingPrimitives use instrucciones de recorte y descarte dentro de los sombreadores y deshabilite la capacidad de Unity para procesar por lotes representadores recortados.ClippingPrimitives utilize clip/discard instructions within shaders and disable Unity's ability to batch clipped renderers. Al usar primitivas de recorte, debe tener en cuenta estas implicaciones de rendimiento.Take these performance implications in mind when utilizing clipping primitives.

ClippingPlane.cs, ClippingSphere.cs y se pueden usar para controlar fácilmente las propiedades ClippingBox.cs primitivas de recorte.ClippingPlane.cs, ClippingSphere.cs, and ClippingBox.cs can be used to easily control clipping primitive properties. Use estos componentes con los siguientes sombreadores para aprovechar los escenarios de recorte.Use these components with the following shaders to leverage clipping scenarios.

  • Mixed Reality Toolkit/EstándarMixed Reality Toolkit/Standard
  • Mixed Reality Toolkit/TextMeshProMixed Reality Toolkit/TextMeshPro
  • Mixed Reality Toolkit/Text3DShaderMixed Reality Toolkit/Text3DShader

EjemplosExamples

Las escenas ClippingExamples y MaterialGallery muestran el uso de los comportamientos y se pueden encontrar ClippingPrimitive en: MRTK/Examples/Demos/StandardShader/Scenes/The ClippingExamples and MaterialGallery scenes demonstrate usage of the ClippingPrimitive behaviors, and can be found at: MRTK/Examples/Demos/StandardShader/Scenes/

Uso avanzadoAdvanced Usage

De forma predeterminada, ClippingPrimitive solo uno puede recortar un representador a la vez.By default only one ClippingPrimitive can clip a renderer at a time. Si el proyecto requiere más de uno para influir en un representador, el código de ejemplo ClippingPrimitive siguiente muestra cómo lograr esto. If your project requires more than one ClippingPrimitive to influence a renderer the sample code below demonstrates how to achieve this.

Nota

Tener varios ClippingPrimitives clips un representador aumentará las instrucciones del sombreador de píxeles y afectará al rendimiento.Having multiple ClippingPrimitives clip a renderer will increase pixel shader instructions and will impact performance. Desenlaza estos cambios dentro del proyecto.Please profile these changes within your project.

Cómo hacer que dos clips ClippingPrimitives diferentes se represente. Por ejemplo, ClippingSphere y ClippingBox al mismo tiempo:How to have two different ClippingPrimitives clip a render. For example a ClippingSphere and ClippingBox at the same time:

// 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 incurrirá en tiempo de compilación de sombreador adicional.The above change will incur additional shader compilation time.

Cómo hacer que dos de los mismos ClippingPrimitives recorten una representación. Por ejemplo, dos ClippingBoxes al mismo tiempo:How to have two of the same ClippingPrimitives clip a render. For example two ClippingBoxes at the same time:

// 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 componente y SecondClippingBox a la escena y ClippingBox especifique el mismo representador para ambos cuadros.Finally, add a ClippingBox and SecondClippingBox component to your scene and specify the same renderer for both boxes. Ahora ambos cuadros deben recortar el representador simultáneamente.The renderer should now be clipped by both boxes simultaneously.

Consulte tambiénSee also